私はなぜ、次の作品のように混乱しています:Cで変数のexternが省略されていますが、それでも動作しますか?
test.cの
#include <stdio.h>
int g;
// ??? should be extern int g; ???
int main(){
printf("%i\n", g);
return 0;
}
lib.c
int g = 3;
私は、コンパイル時に重複したシンボルエラーを取得していないのですなぜ?私はこれをC++でやろうとしている間にエラーが出るので、私を満足させます。しかし、この例では、externを含めるかどうかにかかわらず、すべてがコンパイルされて動作します(つまり、3が正常に印刷されます)。 Cのexternに関するStackOverflowに関する他の質問をすべて読むと、変数に使用されているexternが変数を宣言しているが、その変数を定義していない(つまりメモリを割り当てている)と誰も言わないようです。しかし、ここでexternを使用しないと、gと呼ばれる2つの別々の変数を定義しているので、何らかの重複シンボルエラーが発生するはずです。しかし、そうではないので、私は非常に混乱しています。
をあなたは 'lib.cを含めていない。その結果、「test.cの」中
g
は、その値が3に初期化されても参照してください「lib.c」で
g
を指し、 '? – Carcigenicateどのようにコンパイル/リンクしますか? –
これは奇妙なC(C++ではない)のものです。こちらをご覧ください:http://stackoverflow.com/questions/3095861/about-tentative-definition、またはこちら:http://ninjalj.blogspot.ch/2011/10/tentative-definitions-in-c.html –