无论如何都要在编译单元之间隐藏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
我需要一个类似静态函数的机制,我不想使用命名空间或匿名命名空间,因为它仍然在目标文件中导出它的符号信息。
答案 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;
}
但请记住,正常的解决方案是使用匿名命名空间来分隔这些内容,如果您担心额外的符号,只需删除二进制文件。