10

私は興味のある次のソースコードを持っています。

#include <stdio.h>
extern int foo;
int foo = 32;

int main()
{
printf("%d", foo);
}

これは完全に正常なコードであり、

gcc -Wall -Wextra -pedantic foo.c

警告はありません。

また、変数は同じファイル内で外部としてもグローバルとしても定義されているため、奇妙に思えます。リンカが同じファイル内の外部変数の参照を見つけるのは簡単だと確信していますが、コーディングエラーのようには見えませんか?もしそうなら、なぜコンパイラはこれについて警告しないのですか?

4

5 に答える 5

14

変なことは何もありません。最初に変数の宣言を行い(コンパイラーにその存在を約束しました)、次に実際に変数を定義しました。そこには問題ありません。

また、デフォルトでは、関数に対してローカルではなく、のように定義されていないすべてのstatic変数extern

于 2013-03-24T13:02:01.873 に答える
8

あなたは何をしているのか誤解しているようですexternextern単にあなたの宣言を定義ではなく単なる宣言にします。

int i; //definition of i
extern int i; //declaration of i

同じ変数の宣言が複数あるのは完全に正常ですが、プログラム全体で1つの定義のみが存在する必要があります。これを関数と比較してください

void f(void); //declaration
void f(void) //definition(and redeclaration)
{
} //definition

変数または関数を使用するには、その宣言のみが必要です。その定義はプログラムのどこにでも現れる可能性があります(リンカがそれを見つけます)。どこでも、同じファイル、別のファイル、または外部ライブラリにすることができます。

于 2013-03-24T13:01:04.113 に答える
7

また、変数は同じファイル内で外部としてもグローバルとしても定義されているため、それは奇妙に思えます。

extern int foo;

int言う:それはという名前のタイプのオブジェクトを定義せずに宣言しますfoo

 int foo = 32;

外部リンケージでint指定されたタイプのオブジェクトを宣言および定義します。foo

矛盾はなく、有効なCコードです。

于 2013-03-24T13:01:29.430 に答える
2

違いは、前者は宣言->extern変数を宣言し、どこかで利用可能になると言っていることです。宣言はいくつでも持つことができ、後者は1回だけ存在しなければならない定義です。
したがって、警告やエラーは発生しないはずです。

于 2013-03-24T13:01:42.180 に答える
1

externは、他の場所で定義されている変数に可視性を提供する方法です...

externは約束のようなものです...

example.hで

extern int g;// promises that this will be in the object code to anything that includes example.h

例。c

int g;
于 2013-03-24T13:07:20.863 に答える