c++ 从命名空间外部的无名命名空间定义函数

h22fl7wq  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(143)

如果我在一个无名命名空间中声明一个类,但在该无名命名空间之外定义成员函数,如下所示:

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.oA2.o链接到一个可执行文件中,我是否违反了ODR?

e4yzc0pl

e4yzc0pl1#

A具有内部链接,因为它属于未命名的命名空间。它的所有成员函数,包括A::A,因此也有内部链接。没有办法改变这一点,它不依赖于你声明(或定义)成员函数的频率或位置。成员函数的链接总是从它们所属的类的链接派生。

相关问题