有没有办法在编译单元中隐藏C ++类定义?

时间:2013-07-11 18:25:56

标签: c++ c++11

无论如何都要在编译单元之间隐藏C ++类定义吗?

考虑,

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


//test2.cpp
struct local
{
    local()
    {
        std::cout<<"test2::local\n";
    }
};

void test2()
{
    local l;
}



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

它应该链接&amp;打印如下,

test1::local
test2::local

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

2 个答案:

答案 0 :(得分:7)

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

namespace {
    struct local
    {
        local()
        {
           std::cout<<"test1::local\n";
        }
    };
}

void test1()
{
    local l;
}

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

答案 1 :(得分:0)

您的代码违反了此处的一个定义规则,因为您有两个具有相同范围和名称但定义不同的类。因此,所有投注均已关闭,it should link & print like below,是完全错误的声明,因为您的代码具有未定义的行为。

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

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

    local l;
}

但请记住,正常的解决方案是使用匿名命名空间来分隔这些内容,如果您担心额外的符号,只需删除二进制文件。