在C++ 98,C++ 11交叉编译代码中处理覆盖的优雅方式?

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)

你还有其他选择吗?

(我想正确的做法是不使用显式覆盖).

Pra*_*ian 5

我的做法略有不同

#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包括overridefinal.在您的情况下,您的宏也应该没问题,因为在C++ 03 override中不是关键字,因此定义宏不违反上述规则,并且C++ 11编译器永远不会看到该宏定义.但我仍然喜欢上面的方法.