如果我在一个无名命名空间中声明一个类,但在该无名命名空间之外定义成员函数,如下所示:
A.hpp:
namespace {
struct A{
A();
};
}
A1.cpp:
A::A()
{
std::cout << "hello from A1";
}
A2.cpp
A::A()
{
std::cout << "hello from A2";
}
在链接过程中,其他翻译单元是否可以看到定义的功能?如果我将A1.o
和A2.o
链接到一个可执行文件中,我是否违反了ODR?
1条答案
按热度按时间e4yzc0pl1#
A
具有内部链接,因为它属于未命名的命名空间。它的所有成员函数,包括A::A
,因此也有内部链接。没有办法改变这一点,它不依赖于你声明(或定义)成员函数的频率或位置。成员函数的链接总是从它们所属的类的链接派生。