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

Aru*_*mar 0 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();
}
Run Code Online (Sandbox Code Playgroud)

它应链接和打印如下,

test1::local
test2::local
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*ker 7

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

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

void test1()
{
    local l;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 啊啊,我几乎记不起找到它的任何名字,但是http://blogs.msdn.com/b/oldnewthing/archive/2013/02/06/10391383.aspx (4认同)
  • @chris - 哎呀,我没注意到(虚假)的要求. (2认同)
  • @kbok - 使用`static int i;`名称`i`具有内部链接,因此在定义它的翻译单元外部不可见.对于一个未命名的命名空间,该名称具有外部链接,因此从技术上讲它是可见的,但它被编译器驱动,因此它无法识别.这是因为前C++ 11规则只能将具有外部链接的名称用作模板参数.在未命名的命名空间内部链接中给出名称会更有意义,但它也意味着它们不能用作模板参数.C++ 11改变了这两个规则(续) (2认同)