3 つのソース ファイル ( .c ) を含む .c があり、そのうちの 3 つに"file.h"が含まれているとし#include "file.h"
ます。
それfile.h
自体で私は書いint num=4
た。
一般的な起動の問題があります。私が書いたときint num
、それはコンパイルされました。
何が問題ですか?そして、なぜ非初期化ケースが機能するのですか?
(私はエクリプスを使用しています)
C ヘッダー ファイルには、コンパイラ用の特別なセマンティクスはありません。プリプロセッサによってインラインで展開される単なるテキストです。これは、変数定義がリンカーによって 3 回表示されることを意味します。混乱を避けるために、リンカは 3 つの値のうちどれが正しいかを知りません。今回はたまたま同じ値を持っていたとしても、リンカーは愚かで、それを知りません。
「int num;」だけの場合は、変数がデータではなくコモンとして割り当てられ、リンカが最終リンク段階でコモンを統合することを認識している特殊なケースです。一般に、コモンを使用するのは悪い形式であり、ヘッダー ファイルには「extern int foo;」のみを含める必要があります。一方、変数自体は 1 つのリンキング ユニットでのみ定義されます。
グローバル変数は何度でも宣言できますが、初期化は 1 つの翻訳単位で 1 回だけにしてください。だから書面file.h
で
extern int num;
そしていくつかのfile.c
書き込みで
int num = 4;
最後の行は 1 つの C ファイルにのみ含めるようにしてください。他のものは、その 1 回のオカレンスの値を使用します。