extern int x;
54
35
5 Answer
94
ヘッダファイルで変数を宣言する必要があります。
extern int x;
それから_one_Cファイルでそれを定義します。
int x;
Cでは、定義と宣言の違いは、定義が変数のためのスペースを予約するのに対して、宣言は単に変数をシンボルテーブルに導入するだけです(そして、リンク時にはリンカがそれを探しに行きます)。 。
32
ヘッダファイルの中でそれを `extern`として宣言し、それをちょうど1つの.cファイルの中で定義することができます(するべきです)。
// file.h extern int x; // declaration // file.c #include "file.h" int x = 1; // definition and re-declaration
10
あなたがそれを好きなら宣言すれば
int x;
複数の場所にインクルードされているヘッダファイルでは、xの複数のインスタンス(そしてコンパイルやリンクの問題を引き起こす可能性があります)になります。
これにアプローチする正しい方法は、ヘッダーファイルに次のように言わせることです。
extern int x; / * foo.cで宣言されています* /
そしてfoo.cであなたは言うことができる
int x; / * foo.hにエクスポートされた* /
あなたが好きなだけ多くの場所にあなたのヘッダファイルを含めることができます。
3
重要なのは、ヘッダファイルとソースファイルの変数の宣言を同じにすることです。
私はこのトリックを使います
------ sample.c ------ #define sample_c #include sample.h (サンプルの残り.c) ------ sample.h ------ #ifdef sample_c #define EXTERN #else #define EXTERN extern #endif EXTERN int x;
Sample.cは一度だけコンパイルされ、変数を定義します。 sample.hを含むファイルには、変数の "extern"だけが与えられます。その変数にスペースを割り当てます。
あなたがxのタイプを変えるとき、それは皆のために変わるでしょう。 ソースファイルとヘッダーファイルで変更することを忘れないでください。
-1
この解決策はどうですか?
#ifndef VERSION_H #define VERSION_H static const char SVER [] = "14.2.1"; static const char AVER [] = "1.1.0.0"; #その他 extern static const char SVER []; extern static const char AVER []; #endif / * VERSION_H * /
唯一の欠点は、同じファイルに2回含めるとインクルードガードがあなたを救わないことです。