我有一些代码具有可选的内置代码,这些代码试图检测C++0X。让我们假设这是可行的(讨论跨平台的问题有多糟糕,如何不跨平台,这超出了这个问题的范围)。让我们说它有一个#define DETECTCXX0X
。敌我识别是C++0X。
这么做是多么糟糕的想法:
#ifndef DETECTCXX0X
#define override
#endif
你还有别的选择吗?
(我认为正确的做法就是不要使用显式覆盖)。
发布于 2014-03-07 20:25:38
正如伊戈尔·坦代尼克( Igor )指出的那样,在C++11和C++98中这样说是合法的:
int override = 10;
因为override
并不是真正的关键字,即使在C++11中也是如此。如果您的代码这样做了,那么您的宏将在C++98模式下破坏它。如果您禁止使用这样的标识符,那么您的方法就会正常工作。唯一的问题是您可能忘记了这条规则,并且很难理解错误消息。如果您正在使用某种可以自定义的linter,那么您可以添加一条规则来消除这个问题。
另一种选择是Praetorian的解决方案:
#ifndef DETECTCXX0X
#define OVERRIDE
#else
#define OVERRIDE override
#endif
然而,国际海事组织( IMO )认为,这会导致代码的丑陋和难以阅读。
如果你有能力做以下事情,那么我建议你这样做:
#ifndef DETECTCXX0X
#error C++11 support required
#endif
如果您无法避免非C++11编译器,那么第二个最好的选择,如果您有这个链接,是使用它与#define override
。第三,最好是根本不使用这个特定的C++11特性。在我看来,最不理想的选择是#define OVERRIDE override
。
发布于 2014-03-07 19:42:49
我会稍微改变一下
#ifndef DETECTCXX0X
#define OVERRIDE
#else
#define OVERRIDE override
#endif
然后将函数定义为
void foo() OVERRIDE;
这样做可以避免藐视规则。自第17.6.4.3.1/2节macro.names
翻译单元不能在词汇上与关键字、表3中列出的标识符或7.6中描述的属性标记相同。
表3包括override
和final
。在您的例子中,您的宏也应该是可以的,因为在C++03 override
中不是关键字,所以定义宏并不违反上述规则,C++11编译器将永远不会看到这个宏定义。但我还是更喜欢上面的方法。
发布于 2014-03-07 19:43:10
这个解决方案似乎是解决你面临的问题的一个相当合理的方法。在#define
override
中使用C++98是非常好的,因为它不是关键字。
https://stackoverflow.com/questions/22259199
复制相似问题