いくつかのソースで使用される可能性のある変数がある場合-ヘッダーで宣言することをお勧めしますか?または.c
ファイルで宣言し、他のファイルでextern
を使用する方が良いでしょうか?
宣言ヘッダーファイル内の変数:
extern int x;
そしてdefine it in one Cファイル:
int x;
Cでは、定義と宣言の違いは、定義が変数用のスペースを予約するのに対して、宣言は単に変数をシンボルテーブルに導入するだけである(そして、リンク時間になるとリンカーがそれを探すようになる) 。
ヘッダーファイルでextern
として宣言し(すべき)、正確に1つの.cファイルで定義できます。
.cファイルもヘッダーを使用する必要があり、標準パターンは次のように見えることに注意してください。
// file.h
extern int x; // declaration
// file.c
#include "file.h"
int x = 1; // definition and re-declaration
次のように宣言する場合
int x;
複数の場所にインクルードされるヘッダーファイルでは、xの複数のインスタンスが発生します(コンパイルまたはリンクの問題が発生する可能性があります)。
これにアプローチする正しい方法は、ヘッダーファイルに
extern int x; /* declared in foo.c */
そして、foo.cで次のように言うことができます
int x; /* exported in foo.h */
ヘッダーファイルを好きな場所に含めることができます。
重要なのは、ヘッダーファイルとソースファイルで変数の宣言を同じにすることです。
私はこのトリックを使用します
------sample.c------
#define sample_c
#include sample.h
(rest of sample .c)
------sample.h------
#ifdef sample_c
#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN int x;
Sample.cは一度だけコンパイルされ、変数を定義します。 sample.hを含むファイルには、変数の「外部」のみが与えられます。その変数にスペースを割り当てます。
Xのタイプを変更すると、すべてのユーザーに対して変更されます。ソースファイルとヘッダーファイルで変更することを覚えておく必要はありません。