避免重新定义宏定义的类

时间:2012-07-02 23:18:44

标签: c++ class macros

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

2 个答案:

答案 0 :(得分:0)

由于宏无法生成任何C ++预处理程序指令,因此无法定义宏来生成#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的调用。你的系统提供了一个可以提供帮助的pragma。但很可能不是使用编译指示的便携式解决方案。

答案 1 :(得分:-1)

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

可以结合使用__LINE__ macropre-processor token pasting operator ##在宏实例化期间生成唯一标记。

#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 */ };

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