web-dev-qa-db-ja.com

ヘッダーファイルで文字列の配列を定義する方法

テストコードを記述している3軸センサーがたくさんあります。それぞれのCファイルで、同じ文字列が定義されています。

char axis[3][8] = {"X", "Y", "Z"}

これを「for」ループの結果に使用すると、次のように失敗している軸が出力されます。

DEVICETEST_LOG("%s Failed %s axis for Min range\n",device_name[DUT], axis[i]);

スペースを節約するために、ヘッダーファイルで文字列配列を定義して、いたるところに使用できるようにしました。

私はいくつかのことを試しましたが、ヘッダーファイルで定義された文字列の配列を取得できず、反復してコンパイルを渡すことができません。

15
user1054210

リンカーエラーを回避するには、ヘッダーファイルで配列をexternとして宣言し、コードモジュールの1つで配列onceを定義する必要があります。

たとえば:

//myheader.h
extern const char* axis[3];

次にどこか別のコードモジュールで:

//myfile.c
const char* axis[3] = { "X", "Y", "Z" };
13
Jason

ヘッダーファイルに配置する必要がある場合は、externまたはstaticを使用します。

// option 1
// .h
extern char axis[3][8];

// .c
char axis[3][8] = { "X", "Y", "Z" };

// option 2
// .h
static char axis[3][8] = { "X", "Y", "Z" };

Externは、リンカーに、axisという名前のグローバル変数が実装ファイルの1つ(つまり、1つの.c file)、そして私はそれをここで参照する必要があります。

一方、staticはコンパイラーに反対のことを伝えます。この変数を表示して使用できるようにする必要がありますが、リンカーにエクスポートしないで、externまたは参照できないようにします。名前の競合が発生します。

22

これをヘッダーファイルに入れてください

extern char axis[3][8];

これをCファイルに保存します。

char axis[3][8] = {"X", "Y", "Z"};
2
dasblinkenlight

これをヘッダーに追加します。

extern char *axis[];

これをプロジェクトのoneソースファイルに追加します。

char *axis[] = { "X", "Y", "Z", "Time", "Space", "The Scary Door" };
2
Robᵩ

Michael Barr(Netrino)は、ヘッダーファイルへのストレージの宣言を行わないようにアドバイスしています。同様に、Netrino組み込みシステムのコーディング標準では、ヘッダーでの外部ストレージの使用を容認していません。

私は一般的にこれらの原則に同意しますが、それを必要とするCファイルにストレージをexternすることは良いアイデアであることがわかりました。

0
Throwback1986