0

私はとても小さなコードを持っています:

//example1
namespace 
{
    int a;
}

int a;

main()
{
    a++;
    return 0;
}

もちろん、g++ 4.6.1 コンパイラはそれをコンパイルできず、エラーを出力します。

./temp.cpp: In function ‘int main()’:
./temp.cpp:10:5: error: reference to ‘a’ is ambiguous
./temp.cpp:6:5: error: candidates are: int a
./temp.cpp:2:9: error:                 int {anonymous}::a

大丈夫!

しかし、 「 main 」関数内の変数「 a 」への参照を削除すると、プログラムは適切にコンパイルされています。

//example2
namespace 
{
    int a;
}

int a;

main()
{
    return 0;
}

1) g++ コンパイラが変数 " a " の定義を許可するのはなぜですか?

2) それは単に g++ コンパイラの機能であり、他のコンパイラはそのようなコードをコンパイルできません (example2)?

3) g++ コンパイラには、そのようなコード (example2) を欠陥があると解釈するための対応するフラグがありますか?

みんなどうもありがとう!

4

3 に答える 3

4

a2 番目の例は、その翻訳単位の外から引き続きグローバルにアクセスできるため有効です。

匿名名前空間のaは、内部リンケージを持つ変数の定義を提供します。aat グローバル名前空間スコープは、外部リンケージを持つ変数の定義です。extern int a;別の翻訳単位で aを宣言して使用できます。

于 2013-04-30T13:41:43.880 に答える
1

簡単に言えば、「違法なことは何もないから」です。a間違っているのは、メインで使用しているだけです。使用::aすると、グローバルなものが提供されます(名前空間なし)。

aまた、名前空間自体の中で使用することもできます。たとえば、次の関数を使用できます。

namespace {
   int a;

   int work_with_a()
   {
      a += 2;
      return a;
   }

}


int a;

int main()
{
   ::a++;

   int b = work_with_a();

   cout << ::a + b; 
}
于 2013-04-30T13:47:41.330 に答える
1

afrom の匿名名前空間で を参照できないからといっmainて、コードが無効であるとは限りません。

匿名名前空間内のaは、引き続き匿名名前空間内から参照できます。

グローバルaはどこからでも参照できます (あいまいさを取り除くため::aに inを使用する必要があります)。main

于 2013-04-30T13:49:16.707 に答える