避免重新定义宏定义的类

Avoiding redefinition of a macro-defined class

本文关键字:宏定义 定义 新定义      更新时间:2023-10-16

C++中是否有一种机制可以用来实现宏,以便宏定义一个类,同时多次调用宏不会导致类重定义错误?谢谢!

由于宏无法生成任何C++预处理器指令,因此宏的定义无法生成保护 if 不重新生成#define。 您必须以某种方式使用单独的预处理器控件来处理它:

#define CLASS_GENERATOR_MACRO(x, y, z) ...defines class x with attributes y, z...
#ifndef GENERATED_CLASS_A
#define GENERATED_CLASS_A
CLASS_GENERATOR_MACRO(a, int, vector<std::string>);
#endif /* GENERATED_CLASS_A */

但是,没有什么可以自动强制只使用 CLASS_GENERATOR_MACRO 来创建类a。 也就是说,该文件还可以包含:

CLASS_GENERATOR_MACRO(a, double, double);

编译器会抱怨类的重新定义(如果两者都出现在同一个范围内)。

宏可以生成 _Pragma 的调用。 您的系统有可能提供可以提供帮助的编译指示。 但很可能没有使用编译指示的便携式解决方案。

此解决方案假定所需的行为是在每次使用宏时实例化一个新类,但名称不同。

可以将__LINE__宏和预处理器令牌粘贴运算符结合使用,##在宏实例化期间生成唯一令牌。

#define LOCAL_CLASS(_Base) class _Base ## __LINE__ { /* class definition */ }

然后可以这样使用:

LOCAL_CLASS(SomeBase);
LOCAL_CLASS(SomeBase);

这将生成以下代码(假设宏在源文件的第 2 行和第 3 行实例化:

class SomeBase2 { /* class definition */ };
class SomeBase3 { /* class definition */ };

此解决方案的缺点是生成的类的名称会根据文件中声明它的位置而变化,因此不能依赖它。如果说,该类不是由宏的用户使用,这不是问题;该类保存的信息由宏自动注册到外部库。