2017-02-21 3 views
7

[basic.link]/6(私のemphasiss):なぜ以下の例で `extern`指定子を使用することを主張したのですか?

関数の名前は、ブロックスコープで宣言され、ブロックスコープのextern宣言で宣言された変数の名前が結合を有する

...
static void f(); 
static int i = 0; 

void g() { 
    extern void f(); // internal linkage 
    int i; // #2 i has no linkage 
    { 
     extern void f(); // internal linkage <-- 
     extern int i; // #3 external linkage 
    } 
} 

[basic.link]/7
...

namespace X { 
    void p() { 
     q(); // error: q not yet declared 
     extern void q(); // q is a member of namespace X <-- 
    } 
    void middle() { 
     q(); // error: q not yet declared 
    } 
    void q() { /* ... */ } // definition of X::q 
} 
void q() { /* ... */ } // some other, unrelated q 

矢印で指し示さextern指定子は、非常に最初の文の段落の[basic.link]/6で強調与えられ、必要ではありません大胆な文字です。何か不足していますか?

+0

@ShafikYaghmourこれは変​​数であり、関数ではありません。 – Barry

答えて

1

extern Sがにあるextern(つまり段落で概説ルールによる)特定の状況に影響を及ぼさないことを指摘し、それぞれのコメントを強調する。最初の例で

fは、それが最初の名前空間スコープでstaticを宣言したため、extern宣言さにもかかわらず、内部結合を有しています。第exmapleで

qもそれなし名前空間スコープで宣言(およびX::q::qよりも優先される)されているため、externが宣言に影響を及ぼしません。

1

私は、この例題がそうでないかもしれないが間違ったアイデアを打ちのめすと思う。第6項1に

はそれがexternが「正常」(すなわち、ファイルスコープで)何を意味するのかであるため、f()外部リンケージを持つように期待するかもしれないが、それがさらにアップし、実際のでstatic宣言の内部リンケージです。段落に

7誰かがそれがmiddle()で呼び出すことができるよう、の(あるいは緩いスピーチ外部までで)p()q()利用できる外を作るためにextern void q();を期待するかもしれないが、それはどちらか発生しません。

externキーワードがなくても両方とも依然として真であるが、それでexternが何か異なることを期待している人にとっては驚くことではない。

関連する問題