有没有办法隐藏C++;跨编译单元的类定义? 无论如何,在编译单元上隐藏C++类定义吗?< /P>

有没有办法隐藏C++;跨编译单元的类定义? 无论如何,在编译单元上隐藏C++类定义吗?< /P>,c++,c++11,C++,C++11,考虑一下 //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() {

考虑一下

//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.cpp
void test1()
{
    struct local
    {
        local()
        {
           std::cout<<"test1::local\n";
        }
    };

    local l;
}
//test1.cpp
void test1()
{
结构局部
{
本地()
{

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

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

void test1()
{
    local l;
}
名称空间{
结构局部
{
本地()
{

给你的类起不同的名字。这里的代码违反了一个定义规则(ODR),因为它以两种不同的方式定义了同一个名称。这会产生未定义的行为。匿名名称空间正是您所需要的,符号信息是一个实现细节,您不必担心。@chris-哎呀,我没有注意到(假的)requirement.Aha,为了找到它,我几乎记不起任何名称,但学究注:它们被称为未命名,而非匿名。@CoryNelson-那么为什么我总是称它们为匿名名称空间?没关系…@kbok-with
static int I;
名称
I
具有内部链接,因此在翻译单元之外是看不到的它已定义。对于未命名的命名空间,名称具有外部链接,因此从技术上讲它是可见的,但编译器会将其屏蔽,使其无法识别。这是因为C++11之前的规则,即只有具有外部链接的名称才能用作模板参数。在未命名的命名空间内部链接中提供名称会使更合理,但这也意味着它们不能用作模板参数。C++11更改了这两个规则(续)
namespace {
    struct local
    {
        local()
        {
           std::cout<<"test1::local\n";
        }
    };
}

void test1()
{
    local l;
}