如何在 C++ 中制作可调试文件范围(静态?)class?
How to make a debuggable file scoped (static?) class in c++?
我在我的cpp文件中定义了很多类。通常使用缺乏想象力的名称,例如 'Implementation'。并且担心名称冲突,因为这些名称冲突很难调试(假设编译器默默地删除其中一个定义)。但是,我还希望能够调试我的程序,所以匿名名称空间不是一个选项。那么,是否可以在不使用名称空间的情况下在 c++ 中定义文件作用域(又名翻译单元作用域)类?如果是,如何?
c 中的文件作用域
在 c 中,可以使用 int foo;
创建一个全局变量,并使用 static int foo;
将变量限制在文件范围内。同样,文件范围的函数也使用 static
关键字创建,例如 static void bar();
。并且结构不定义数据或可执行代码,因此实际上始终是文件范围的。
虚拟成员函数
现在 c++ 引入了虚拟成员函数,这导致结构(又名 类)包含数据和可执行代码。因此,结构现在是全局定义的。但是,不允许使用 static 再次使结构文件作用域。 IE。 static struct Foo{};
不编译。
命名空间
为了解决名称冲突问题,c++ 还引入了命名空间。这些也可用于包装结构,使其成为伪文件范围的。尽管这仍然迫使您为每个文件选择一个唯一的名称(您甚至不关心)。作为解决方案,他们还引入了匿名命名空间。不幸的是,gdb 和 visual studio 调试器似乎都不支持匿名命名空间(基本上不可能引用匿名命名空间内的任何内容)。
部分解决方案是使用匿名 structs/classes 和 typedef 这些,因为它们都是文件范围的 (C - Limit struct Scope), except that it is impossible to explicitly define constructors or destructors (Constructor for a no-named struct)。以下示例使用 gcc 编译和运行良好,还允许 gdb 在 method()
:
上放置断点
interface.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();
}
main.cpp:
#include "iface.h"
int main() {
Interface * a = new_implementation_a();
Interface * b = new_implementation_b();
a->method();
b->method();
return 0;
}
我在我的cpp文件中定义了很多类。通常使用缺乏想象力的名称,例如 'Implementation'。并且担心名称冲突,因为这些名称冲突很难调试(假设编译器默默地删除其中一个定义)。但是,我还希望能够调试我的程序,所以匿名名称空间不是一个选项。那么,是否可以在不使用名称空间的情况下在 c++ 中定义文件作用域(又名翻译单元作用域)类?如果是,如何?
c 中的文件作用域
在 c 中,可以使用 int foo;
创建一个全局变量,并使用 static int foo;
将变量限制在文件范围内。同样,文件范围的函数也使用 static
关键字创建,例如 static void bar();
。并且结构不定义数据或可执行代码,因此实际上始终是文件范围的。
虚拟成员函数
现在 c++ 引入了虚拟成员函数,这导致结构(又名 类)包含数据和可执行代码。因此,结构现在是全局定义的。但是,不允许使用 static 再次使结构文件作用域。 IE。 static struct Foo{};
不编译。
命名空间
为了解决名称冲突问题,c++ 还引入了命名空间。这些也可用于包装结构,使其成为伪文件范围的。尽管这仍然迫使您为每个文件选择一个唯一的名称(您甚至不关心)。作为解决方案,他们还引入了匿名命名空间。不幸的是,gdb 和 visual studio 调试器似乎都不支持匿名命名空间(基本上不可能引用匿名命名空间内的任何内容)。
部分解决方案是使用匿名 structs/classes 和 typedef 这些,因为它们都是文件范围的 (C - Limit struct Scope), except that it is impossible to explicitly define constructors or destructors (Constructor for a no-named struct)。以下示例使用 gcc 编译和运行良好,还允许 gdb 在 method()
:
interface.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();
}
main.cpp:
#include "iface.h"
int main() {
Interface * a = new_implementation_a();
Interface * b = new_implementation_b();
a->method();
b->method();
return 0;
}