有没有办法隐藏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-withstatic int I;
名称I
具有内部链接,因此在翻译单元之外是看不到的它已定义。对于未命名的命名空间,名称具有外部链接,因此从技术上讲它是可见的,但编译器会将其屏蔽,使其无法识别。这是因为C++11之前的规则,即只有具有外部链接的名称才能用作模板参数。在未命名的命名空间内部链接中提供名称会使更合理,但这也意味着它们不能用作模板参数。C++11更改了这两个规则(续)
namespace {
struct local
{
local()
{
std::cout<<"test1::local\n";
}
};
}
void test1()
{
local l;
}