根据我的理解,.cpp
文件中的全局变量得到外部链接。假设有两个源文件a.cpp
和b.cpp
:
// a.cpp
namespace a_ns
{
int foo;
}
// b.cpp
namespace b_ns
{
int foo;
}
现在假设两者分别在namespace ns=a_ns;
和namespace ns=b_ns;
之后。如果a.cpp
和b.cpp
只为ns
使用相同的名称空间foo
,那么这会触发任何未定义的行为(我认为)吗?
答案 0 :(得分:5)
没有。您提出的别名不会改变变量具有限定名称a_ns::foo
和b_ns::foo
的事实,这些名称不同。
答案 1 :(得分:3)
如果您为foo
使用不同的命名空间,则会引入两个不同的变量,即a_ns::foo
和b_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.cpp
和b_ns
中的b.cpp
。
但是如果你实际上在两个不同的翻译单元中为foo
定义了相同的名称空间,例如namespace ns { int foo; }
和a.cpp
中的b.cpp
,每个.cpp
个文件都会正确编译,但您会收到链接器错误,例如duplicate symbol __ZN2ns3fooE in: ../a.o; ../b.o
。