From my understanding, global variables in a .cpp file get externally linked. Suppose there are two source files, a.cpp and b.cpp:
// a.cpp
namespace a_ns
{
int foo;
}
// b.cpp
namespace b_ns
{
int foo;
}
Now suppose both have right after namespace ns=a_ns; and namespace ns=b_ns; respectively. Will this trigger any undefined behaviour like there would be (I think) if both a.cpp and b.cpp just used the same namespace ns for foo?
No. Your proposed alias does not change the fact that the variables have qualified names a_ns::foo and b_ns::foo, which are different.
If you are using different namespaces for foo, then you introduce two different variables, i.e. a_ns::foo and b_ns::foo. Hence, there is no ambiguity, no conflict, and no undefined behaviour - just two different variables just as if you called the one foo and the other bar.
A namespace alias, even at global scope, does not introduce an ambiguity with other translation units, whereas a duplicate namespace-name would. Confer namespace aliases in this online c++ standard draft), which defines uniqueness for namespace-names within the program, but uniqueness for namespace aliases only within a declarative region:
7.3.2 Namespace alias
A namespace-name or namespace-alias shall not be declared as the name of any other entity in the same declarative region. A namespace-name defined at global scope shall not be declared as the name of any other entity in any global scope of the program. ...
Hence, a namespace alias namespace ns=a_ns introduced in a.cpp will be "visible" only in a.cpp, and namespace ns=b_ns introduced in b.cpp will be "visible" only in b.cpp. So each use of ns::foo will unambiguously refer to a_ns in a.cpp and b_ns in b.cpp, respectively.
But if you actually define the same namespace for foo in two different translation units, e.g. namespace ns { int foo; } in both a.cpp and b.cpp, each individual .cpp-file will be compiled correctly, but you will get a linker error, e.g. duplicate symbol __ZN2ns3fooE in: ../a.o; ../b.o.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With