避免重新定义宏定义的类
Avoiding redefinition of a macro-defined class
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 */ };
此解决方案的缺点是生成的类的名称会根据文件中声明它的位置而变化,因此不能依赖它。如果说,该类不是由宏的用户使用,这不是问题;该类保存的信息由宏自动注册到外部库。
相关文章:
- 如何访问宏中定义的数组元素
- 在 eclipse 中,将宏重定义视为错误而不是警告
- 在宏中定义然后取消定义预处理器变量
- "unix" C++预处理器宏未定义 -std=c++11
- 如何在非可变参数宏旁边定义可变参数宏
- 宏的定义从一个值创建两个参数
- Visual Studio 快速替换宏及其定义
- 为什么使用三元运算符在宏中定义 1 和 0?
- 是否可以定义一个宏来定义枚举类和返回枚举元素计数的 GetCount() 方法
- 防止在宏中定义的匿名变量的解构,直到范围结束
- "_WIN32_WINNT"/"WINVER":宏重新定义
- C 和 C++ 中的宏重定义
- 宏重新定义警告
- 创建"shortcuts"宏类定义
- "Comment"出宏函数定义
- 可视化 C++ 宏重定义的范围是什么
- 重新排序包含目录如何解决宏重定义问题
- 使用预处理器宏取消定义函数
- 警告 C4005 'identifier':宏重定义
- 如何为 tr1::unordered_map 定义不绑定模板参数的宏/类型定义/等?