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

第二个示例是有效的,因为您仍然可以a从该翻译单元外部访问全局。

匿名命名空间中的a为具有内部链接的变量提供定义。aat 全局命名空间范围是对具有外部链接的变量的定义。您可以extern int a;在不同的翻译单元中声明 a 并使用它。

于 2013-04-30T13:41:43.880 回答
1

简短的回答是“因为它没有任何违法行为”。它只是a在 main 中使用是错误的。如果你使用::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

仅仅因为您不能a在匿名命名空间中引用main并不意味着代码无效。

匿名命名空间中的a仍然可以从匿名命名空间中引用。

可以从任何地方引用全局a(您必须使用::ainmain来消除歧义)。

于 2013-04-30T13:49:16.707 回答