テストコードを記述している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]);
スペースを節約するために、ヘッダーファイルで文字列配列を定義して、いたるところに使用できるようにしました。
私はいくつかのことを試しましたが、ヘッダーファイルで定義された文字列の配列を取得できず、反復してコンパイルを渡すことができません。
リンカーエラーを回避するには、ヘッダーファイルで配列をextern
として宣言し、コードモジュールの1つで配列onceを定義する必要があります。
たとえば:
//myheader.h
extern const char* axis[3];
次にどこか別のコードモジュールで:
//myfile.c
const char* axis[3] = { "X", "Y", "Z" };
ヘッダーファイルに配置する必要がある場合は、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または参照できないようにします。名前の競合が発生します。
これをヘッダーファイルに入れてください
extern char axis[3][8];
これをCファイルに保存します。
char axis[3][8] = {"X", "Y", "Z"};
これをヘッダーに追加します。
extern char *axis[];
これをプロジェクトのoneソースファイルに追加します。
char *axis[] = { "X", "Y", "Z", "Time", "Space", "The Scary Door" };
Michael Barr(Netrino)は、ヘッダーファイルへのストレージの宣言を行わないようにアドバイスしています。同様に、Netrino組み込みシステムのコーディング標準では、ヘッダーでの外部ストレージの使用を容認していません。
私は一般的にこれらの原則に同意しますが、それを必要とするCファイルにストレージをexternすることは良いアイデアであることがわかりました。