首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++98,C++11交叉编译代码中处理重写的优雅方法?

在C++98,C++11交叉编译代码中处理重写的优雅方法?
EN

Stack Overflow用户
提问于 2014-03-07 19:39:47
回答 3查看 1.9K关注 0票数 1

我有一些代码具有可选的内置代码,这些代码试图检测C++0X。让我们假设这是可行的(讨论跨平台的问题有多糟糕,如何不跨平台,这超出了这个问题的范围)。让我们说它有一个#define DETECTCXX0X。敌我识别是C++0X。

这么做是多么糟糕的想法:

代码语言:javascript
运行
复制
#ifndef DETECTCXX0X
#define override
#endif

你还有别的选择吗?

(我认为正确的做法就是不要使用显式覆盖)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-07 20:25:38

正如伊戈尔·坦代尼克( Igor )指出的那样,在C++11和C++98中这样说是合法的:

代码语言:javascript
运行
复制
int override = 10;

因为override并不是真正的关键字,即使在C++11中也是如此。如果您的代码这样做了,那么您的宏将在C++98模式下破坏它。如果您禁止使用这样的标识符,那么您的方法就会正常工作。唯一的问题是您可能忘记了这条规则,并且很难理解错误消息。如果您正在使用某种可以自定义的linter,那么您可以添加一条规则来消除这个问题。

另一种选择是Praetorian的解决方案:

代码语言:javascript
运行
复制
#ifndef DETECTCXX0X
#define OVERRIDE
#else
#define OVERRIDE override
#endif

然而,国际海事组织( IMO )认为,这会导致代码的丑陋和难以阅读。

如果你有能力做以下事情,那么我建议你这样做:

代码语言:javascript
运行
复制
#ifndef DETECTCXX0X
#error C++11 support required
#endif

如果您无法避免非C++11编译器,那么第二个最好的选择,如果您有这个链接,是使用它与#define override。第三,最好是根本不使用这个特定的C++11特性。在我看来,最不理想的选择是#define OVERRIDE override

票数 1
EN

Stack Overflow用户

发布于 2014-03-07 19:42:49

我会稍微改变一下

代码语言:javascript
运行
复制
#ifndef DETECTCXX0X
#define OVERRIDE
#else
#define OVERRIDE override
#endif

然后将函数定义为

代码语言:javascript
运行
复制
void foo() OVERRIDE;

这样做可以避免藐视规则。自第17.6.4.3.1/2节macro.names

翻译单元不能在词汇上与关键字、表3中列出的标识符或7.6中描述的属性标记相同。

表3包括overridefinal。在您的例子中,您的宏也应该是可以的,因为在C++03 override中不是关键字,所以定义宏并不违反上述规则,C++11编译器将永远不会看到这个宏定义。但我还是更喜欢上面的方法。

票数 6
EN

Stack Overflow用户

发布于 2014-03-07 19:43:10

这个解决方案似乎是解决你面临的问题的一个相当合理的方法。在#define override中使用C++98是非常好的,因为它不是关键字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22259199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档