Ide*_*Hat 0 c++ macros overriding c++11
我有一些代码具有可选的内置代码,试图检测C++ 0X.让我假装这是有效的(讨论有多糟糕,如何不跨越平台超出这个问题的范围).让我们说它有一个#define DETECTCXX0X.iff它是C++ 0X.
这样做有多糟糕:
#ifndef DETECTCXX0X
#define override
#endif
Run Code Online (Sandbox Code Playgroud)
你还有其他选择吗?
(我想正确的做法是不使用显式覆盖).
我的做法略有不同
#ifndef DETECTCXX0X
#define OVERRIDE
#else
#define OVERRIDE override
#endif
Run Code Online (Sandbox Code Playgroud)
然后将函数定义为
void foo() OVERRIDE;
Run Code Online (Sandbox Code Playgroud)
这样做可以避免藐视规则.来自§17.6.4.3.1/ 2 [macro.names]
翻译单元不得
#define或在#undef词汇上命名与关键字,表3中列出的标识符或7.6中描述的 属性标记相同.
表3包括override和final.在您的情况下,您的宏也应该没问题,因为在C++ 03 override中不是关键字,因此定义宏不违反上述规则,并且C++ 11编译器永远不会看到该宏定义.但我仍然喜欢上面的方法.