web-dev-qa-db-ja.com

ヘッダーファイルでの変数宣言

いくつかのソースで使用される可能性のある変数がある場合-ヘッダーで宣言することをお勧めしますか?または.cファイルで宣言し、他のファイルでexternを使用する方が良いでしょうか?

58
Ori Popowski

宣言ヘッダーファイル内の変数:

extern int x;

そしてdefine it in one Cファイル:

int x;

Cでは、定義と宣言の違いは、定義が変数用のスペースを予約するのに対して、宣言は単に変数をシンボルテーブルに導入するだけである(そして、リンク時間になるとリンカーがそれを探すようになる) 。

99
Martin B

ヘッダーファイルでexternとして宣言し(すべき)、正確に1つの.cファイルで定義できます。

.cファイルもヘッダーを使用する必要があり、標準パターンは次のように見えることに注意してください。

// file.h
extern int x;  // declaration

// file.c
#include "file.h"
int x = 1;    // definition and re-declaration
34
Henk Holterman

次のように宣言する場合

int x;

複数の場所にインクルードされるヘッダーファイルでは、xの複数のインスタンスが発生します(コンパイルまたはリンクの問題が発生する可能性があります)。

これにアプローチする正しい方法は、ヘッダーファイルに

extern int x; /* declared in foo.c */

そして、foo.cで次のように言うことができます

int x; /* exported in foo.h */

ヘッダーファイルを好きな場所に含めることができます。

11
Vicky

重要なのは、ヘッダーファイルとソースファイルで変数の宣言を同じにすることです。

私はこのトリックを使用します

------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のタイプを変更すると、すべてのユーザーに対して変更されます。ソースファイルとヘッダーファイルで変更することを覚えておく必要はありません。

3
Robert