有没有一种方法可以在编译单元中隐藏C++类定义

Is there a way to hide the C++ class definition across compilation unit?

本文关键字:单元 编译 隐藏 C++ 定义 一种 方法 有没有      更新时间:2023-10-16

是否存在跨编译单元隐藏C++类定义的方法?

考虑一下,

//test1.cpp
struct local
{
    local()
    {
       std::cout<<"test1::localn";
    }
};
void test1()
{
    local l;
}

//test2.cpp
struct local
{
    local()
    {
        std::cout<<"test2::localn";
    }
};
void test2()
{
    local l;
}

//main.cpp
void test1();
void test2();
int main()
{
   test1();
   test2();
}

它应该链接&打印如下,

test1::local
test2::local

我需要一个类似于静态函数的机制,我不想使用名称空间或匿名名称空间,因为它的符号信息仍然导出在对象文件中。

您可以使用匿名名称空间:

namespace {
    struct local
    {
        local()
        {
           std::cout<<"test1::localn";
        }
    };
}
void test1()
{
    local l;
}

这有效地将名称local的范围限制为使用它的翻译单元。(从形式上讲,这是不正确的,但如果你这样想,你就不会出错)

您的代码违反了这里的一个定义规则,因为您有两个作用域和名称相同但定义不同的类。因此,所有的赌注都是无效的,it should link & print like below,是一个完全错误的语句,因为您的代码具有未定义的行为。

然而,在这种情况下,我认为函数本地类型可能正是您想要的,例如:

//test1.cpp
void test1()
{
    struct local
    {
        local()
        {
           std::cout<<"test1::localn";
        }
    };
    local l;
}

但请记住,正常的解决方案是使用匿名名称空间来分离这些东西,如果担心额外的符号,只需剥离二进制文件。