我是否可以使用C ++中的机制来实现宏,以便宏定义一个类,同时宏的多次调用不会导致类重定义错误?谢谢!
答案 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__
macro和pre-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 */ };
此解决方案的缺点是生成的类的名称会根据文件的声明位置而更改,因此无法依赖。这不是问题,如果该类不打算由宏的用户使用;该类保存信息,宏由外部库自动注册。