如何在 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.cppimplementation_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;
}