如何在 c++ 中创建一个可调试的文件作用域(静态?)类
How to make a debuggable file scoped (static?) class in c++?
我在 cpp 文件中定义了很多类。通常使用缺乏想象力的名称,例如"实施"。并且担心名称冲突,因为这些很难调试(假设编译器静默地删除其中一个定义)。但是,我也希望能够调试我的程序,因此匿名命名空间不是一个选项。那么,是否可以在不使用命名空间的情况下在 c++ 中定义文件范围(又名翻译单元范围)类?如果是,如何?
c
中的文件范围在 c 中,可以使用 int foo;
创建一个全局变量,并使用 static int foo;
将变量限制在文件范围内。同样,文件范围的函数也是使用 static
关键字创建的,例如 static void bar();
。结构不定义数据或可执行代码,因此实际上始终是文件范围的。
虚拟成员函数
现在 c++ 引入了虚拟成员函数,这导致结构(又名类)包含数据和可执行代码。因此,结构现在是全局定义的。但是,不允许使用静态使结构再次具有文件范围。即 static struct Foo{};
不编译。
命名空间
为了解决名称冲突问题,c++ 还引入了命名命名空间。这些也可用于包装结构,使其成为伪文件范围。尽管这仍然迫使您为每个文件选择一个唯一的名称(您甚至不关心)。作为解决方案,他们还引入了匿名命名空间。不幸的是,gdb 和 Visual Studio 调试器似乎都不支持匿名命名空间(基本上不可能引用匿名命名空间中的任何内容)。
部分解决方案是使用匿名结构/类并对这些结构/类进行 typedef,因为两者都是文件范围的(C - 限制结构作用域),除了不可能显式定义构造函数或析构函数(无命名结构的构造函数)。下面的示例使用 gcc 编译并运行良好,还允许 gdb 在 method()
上放置断点:
接口.h:
struct Iface {
virtual void method()=0;
};
implementation_a.cpp和implementation_b.cpp:
#include "interface.h"
typedef struct : Interface {
virtual void method();
} Implementation;
void Implementation::method() {
// Do stuff...
}
Interface * new_implementation_a() { // or new_implementation_b
return new Implementation();
}
主.cpp:
#include "iface.h"
int main() {
Interface * a = new_implementation_a();
Interface * b = new_implementation_b();
a->method();
b->method();
return 0;
}
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 如何在添加文件的情况下在VSCode中调试C++程序
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- OpenCV 3 Visual Studio 2017 调试,调用堆栈没有.pdb文件
- 创建进行生产构建并创建调试信息的C++生成文件的最佳方法?
- 如何使用 lldb 在曼扎罗中调试 lz4 文件格式的核心转储?
- VSCode C++调试文件名中包含中文字符的文件时插件损坏
- 在 Windows 10 下使用 GTest 的 CMake - 致命错误 LNK1104:无法打开文件"gtest.lib",但存在调试"gtestd.lib"
- 使用dll源代码C++调试dll文件
- 如何调试visual studio 2017生成的C++代码.android中的SO文件和其他第三方库
- 在Linux Mint 19下,从哪里提取wxWidgets的源代码(.cpp文件)用于步骤内部调试
- 如何修复使用VScode调试器gcc调试时的"找不到文件"错误
- 错误 VSP1011:无法获取调试信息.与 /配置文件链接器开关链接
- 在h文件上内联发布版本并在cpp上实现调试版本的函数
- Visual Studio控制台调试了错误的文件
- 在使用 vs 代码调试文件时,如何将文件传递到我的程序中
- 从命令提示符使用 MSBuild 调试简单的C++可执行文件
- 调试Visual Studio中可执行文件调用的C 文件
- BS-42e6.gcno 文件调试
- 使用 lib.a 文件调试链接错误