2017-09-20 13 views
3

いくつかのソースコードを分析していますが、というファイルが1つのファイル(.c)であり、別のファイルではありません。(これはflexで作成されたファイルのコードの1つで、 string.hのyyinを定義し、ERRNO.H、STDLIB.H、inttypes.h)):変数の宣言とそのextern宣言の両方が同じファイルに存在するとはどういう意味ですか?

extern FILE *yyin, *yyout; 

FILE *yyin = (FILE*) 0, *yyout = (FILE *) 0; 

私は基本的に、これらのステートメントが何を意味するか知っています。

しかし、externキーワードは、変数や関数などの定義を別のファイルに使用するために使用されます。 (それはそれのためのメモリを割り当てません。)

だから、私は何を意味しているコードをその:

FILE *yyin = (FILE*) 0, *yyout = (FILE *) 0; 

はなく、同じファイル内に、別のファイルに表示しなければなりません。例えば

a.c 

extern File *yyin; /* It means that a.c want to use yyin declared in b.c */ 

int main(void) { 
    yyin = *expressions*; /* yyin is variable in b.c */ 

    return 0; 
} 

b.c 

File *yyin = (FILE*) 0; 

は、なぜ彼らは同じファイルに存在していますか?同じ名前を使用するexternキーワードと通常の変数宣言が同じファイルに存在する場合、特別な意味はありますか?

+0

あなたが '#include'のしくみについて考えるならば、定義がある翻訳単位には通常、extern宣言があることに気付くでしょう –

答えて

2

最初の宣言は、デフォルトに頼るのではなく、externを明示的に指定する点で珍しいです。変数はファイルスコープで宣言されているので、彼らはデフォルトで外部リンケージを持って、あなたのケースでは、すなわち、宣言は、各変数はスコープ記憶域期間を持つことを*

FILE *yyin, *yyout; 

にリコール同等です
、および リンケージ。キーワード externは、変数に外部リンケージがあることを指定します。リンケージの他のオプションは staticであり、リンケージはありません。

変数は複数の宣言を持つことができます。複数の宣言が互いに競合しない限り、Cコンパイラはそれらを組み合わせることができます。

ケース変数yyinyyoutには、変数に外部リンケージがあり、両方の変数をNULLに初期化するという宣言があります。

*yyinyyoutという宣言は他にありません。一般的に、externのない宣言は、同じ翻訳単位に他の定義がない場合、定義になる可能性があります。これは、仮定義と呼ばれます。 externの宣言は暫定的な定義にはなりません。

+0

私の場合、グローバル変数はデフォルトで外部リンケージを持っていますが、ここのexternキーワードは明示的に外部リンクを持つことを明示しています。 私はそうですか? – user7159879

+0

@ user7159879右。これは通常のグローバル変数を宣言する珍しい方法です。 – dasblinkenlight

+1

「extern」の有無はまったく同じではありません。「extern」がなければ、それは不可能な「extern」との*仮の定義*になる可能性があります。 –

関連する問題