据我所知,.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
只是为foo
使用了相同的命名空间ns
?
据我所知,.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
只是为foo
使用了相同的命名空间ns
?
a_ns :: foo
和 b_ns :: foo
,它们是不同的。ns::foo
会发生什么呢?(ns
是 ns_a
和 ns_b
都别名的通用命名空间别名)。 - vsoftcons::foo
时,你引用对应的变量——无论是 a_ns::foo
还是 b_ns::foo
,具体取决于上下文。 - Kerrek SBnamespace ns=a_ns;
和 namespace ns=b_ns;
。引用标准:“在一个声明区域内,可以使用命名空间别名定义来重新定义在该声明区域中声明的命名空间别名,以仅引用它已经引用的命名空间。” - Benjamin Tfoo
使用不同的命名空间,则会引入两个不同的变量,即a_ns::foo
和b_ns::foo
。因此,没有歧义、冲突或未定义行为-就像您调用一个foo
和另一个bar
一样,只是两个不同的变量。命名空间名称
的唯一性,但仅在声明区域内定义了命名空间别名
的唯一性:
因此,在7.3.2 命名空间别名
在同一声明区域中,不得将命名空间名称或命名空间别名声明为任何其他实体的名称。在全局范围内定义的命名空间名称不得在程序的任何全局范围内声明为任何其他实体的名称。...
a.cpp
中引入的命名空间别名namespace ns=a_ns
只能在a.cpp
中“可见”,而在b.cpp
中引入的namespace ns=b_ns
只能在b.cpp
中“可见”。因此,每个ns::foo
的使用将分别明确地引用a_ns
和b_ns
。foo
,例如在a.cpp
和b.cpp
中都定义了namespace ns { int foo; }
,则每个单独的.cpp
文件将被正确编译,但您将收到一个链接器错误,例如duplicate symbol __ZN2ns3fooE in: ../a.o; ../b.o
。