命名空间别名是否会更改链接?

时间:2017-10-29 22:42:11

标签: c++

根据我的理解,.cpp文件中的全局变量得到外部链接。假设有两个源文件a.cppb.cpp

// a.cpp
namespace a_ns
{
  int foo;
}

// b.cpp
namespace b_ns
{
  int foo;
}

现在假设两者分别在namespace ns=a_ns;namespace ns=b_ns;之后。如果a.cppb.cpp只为ns使用相同的名称空间foo,那么这会触发任何未定义的行为(我认为)吗?

2 个答案:

答案 0 :(得分:5)

没有。您提出的别名不会改变变量具有限定名称a_ns::foob_ns::foo的事实,这些名称不同。

答案 1 :(得分:3)

如果您为foo使用不同的命名空间,则会引入两个不同的变量,即a_ns::foob_ns::foo。因此,没有歧义,没有冲突,没有未定义的行为 - 只是两个不同的变量,就像你调用一个foo而另一个bar

命名空间别名,即使在全局范围内,也不会引入与其他转换单元的歧义,而重复的命名空间名称则会引起歧义。提供namespace aliases in this online c++ standard draft),它定义了程序中namespace-names的唯一性,但仅在声明性区域内namespace aliases的唯一性:

  

7.3.2命名空间别名

     

不应将名称空间名称或名称空间别名声明为名称   在同一声明区域中的任何其他实体。命名空间名称   在全球范围内定义的,不得声明为任何其他名称   任何全球范围内的实体。 ...

因此,namespace ns=a_ns中引入的命名空间别名a.cpp仅在a.cpp中“可见”,namespace ns=b_ns中引入的b.cpp将“可见” “只在b.cpp。因此ns::foo的每次使用都会明确地分别引用a_ns中的a.cppb_ns中的b.cpp

但是如果你实际上在两个不同的翻译单元中为foo定义了相同的名称空间,例如namespace ns { int foo; }a.cpp中的b.cpp,每个.cpp个文件都会正确编译,但您会收到链接器错误,例如duplicate symbol __ZN2ns3fooE in: ../a.o; ../b.o