0

是否有跨编译单元隐藏 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();
}

它应该像下面那样链接和打印,

test1::local
test2::local

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

4

2 回答 2

7

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

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

void test1()
{
    local l;
}

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

于 2013-07-11T18:30:57.680 回答
0

您的代码在这里违反了一个定义规则,因为您有两个具有相同范围和名称但定义不同的类。因此,所有的赌注都被取消了,it should link & print like below,这是一个完全错误的陈述,因为您的代码具有未定义的行为。

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

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

    local l;
}

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

于 2013-07-11T18:30:17.530 回答