2

VC++ 10 で次のソースをコンパイルするiと、静的リンケージが割り当てられますが42 、G++ 4.5.1 ではi、source2.cpp の外部リンケージが割り当てられ42ます。

基準に従った標準確認動作とは何か、またはその理由についてのアイデアはありますか?

// source1.cpp

#include <iostream>

static int i = 0;

int h();
void foo()
{
     int i;
     {
         extern int i;
         i = 42;
     }
}

int main()
{
    foo();

    std::cout << i << std::endl;
    std::cout << h() << std::endl;
}

// source2.cpp

int i;
int h() { return i; }
4

1 に答える 1

2

ISO/IEC 14882:2011 3.5/6:

ブロックスコープで宣言された関数名とブロックスコープextern宣言で宣言された変数名はリンクしています。同じ名前と型を持つリンケージを持つエンティティの目に見える宣言がある場合、最も内側のエンクロージング名前空間スコープの外側で宣言されたエンティティは無視され、ブロック スコープ宣言は同じエンティティを宣言し、前の宣言のリンケージを受け取ります。そのような一致するエンティティが複数ある場合、プログラムは不適切な形式です。それ以外の場合、一致するエンティティが見つからない場合、ブロック スコープ エンティティは外部リンケージを受け取ります。

の内部ブロック内では、宣言はグローバル名前空間スコープでfoo()の宣言を隠します。そのため、内部ブロック内のリンケージとの可視性はありません。これは、 がをすぐに囲む名前空間で外部リンケージを持つエンティティを参照することを意味します。int i;static int i;iextern int i;foo()

代入はiwith external リンケージ ( で定義) に影響を与える必要がありますが、で定義された with internal リンケージには影響を与えるsource2.cppべきではありません。isource1.cpp

于 2011-11-26T22:59:21.390 に答える