有没有一种方法可以在编译单元中隐藏C++类定义
Is there a way to hide the C++ class definition across compilation unit?
是否存在跨编译单元隐藏C++类定义的方法?
考虑一下,
//test1.cpp
struct local
{
local()
{
std::cout<<"test1::localn";
}
};
void test1()
{
local l;
}
//test2.cpp
struct local
{
local()
{
std::cout<<"test2::localn";
}
};
void test2()
{
local l;
}
//main.cpp
void test1();
void test2();
int main()
{
test1();
test2();
}
它应该链接&打印如下,
test1::local
test2::local
我需要一个类似于静态函数的机制,我不想使用名称空间或匿名名称空间,因为它的符号信息仍然导出在对象文件中。
您可以使用匿名名称空间:
namespace {
struct local
{
local()
{
std::cout<<"test1::localn";
}
};
}
void test1()
{
local l;
}
这有效地将名称local
的范围限制为使用它的翻译单元。(从形式上讲,这是不正确的,但如果你这样想,你就不会出错)
您的代码违反了这里的一个定义规则,因为您有两个作用域和名称相同但定义不同的类。因此,所有的赌注都是无效的,it should link & print like below,
是一个完全错误的语句,因为您的代码具有未定义的行为。
然而,在这种情况下,我认为函数本地类型可能正是您想要的,例如:
//test1.cpp
void test1()
{
struct local
{
local()
{
std::cout<<"test1::localn";
}
};
local l;
}
但请记住,正常的解决方案是使用匿名名称空间来分离这些东西,如果担心额外的符号,只需剥离二进制文件。
相关文章:
- 用于交叉编译和CMake的预处理器宏的单元测试
- 提升 1.64 单元测试编译失败
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 最佳实践 - 在单元测试中链接到 lib 或编译源代码
- 使用 SCons 提取每个编译单元的编译时间
- 将 lambda 函数转换为另一个编译单元中的普通函数会缩短编译时间吗?
- 我想使用 CMake 生成和编译 Visual Studio projet,我需要从构建中排除单元测试文件。有没有办法做到这一点?
- 模板部分专用化和多个编译单元
- C++模块:模块实现单元进行不必要的重新编译?
- 单元测试 - 仅在"int main()"左右重新编译以减少编译时间
- 单元测试:检查是否不应编译某些表达式
- 使用 CMake 进行单元测试,无需重复编译
- 使用 Boost 单元测试进行 G++ 项目编译
- 如何在编译过程中实现功能单元测试
- 编译单元之间共享的全局常量对象
- Visual studio是否强制将预编译的头文件包含在项目的所有编译单元中
- 每个编译单元是否只有一个未命名的命名空间