首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否存在将C++方言更改为C++11,但在XCode4上保留标准库而不是C++11的风险?

是否存在将C++方言更改为C++11,但在XCode4上保留标准库而不是C++11的风险?
EN

Stack Overflow用户
提问于 2012-09-11 21:38:20
回答 4查看 786关注 0票数 1

假设我有一个不使用任何C++11的跨平台(Win & Mac)生产代码库。

假设mac上的编译器选项已更改为使用C++11语言方言,但没有C++11标准库。

我试着在谷歌上搜索以了解可能的含意,但现在却是空洞无物。

我的问题是:

  1. 用clang语改变语言方言到底意味着什么?
  2. 做这种事有什么危险?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-11 22:30:44

我不使用XCode,但我设想如果他们为clang提供了一个(可能不完整但正在到达的) C++11模式,那么他们也会发布一个(可能不完整但正在实现) C++11标准库。一起测试。所以你的情况不应该出现,但假设情况是这样的:

  1. 在形式上,它并不意味着什么,因为标准不承认任何混合和匹配“语言”和“库”的方法。这取决于你的编译器认为它意味着什么。它的意思可能是新的“语言特性”(如rvalue引用、lambdas等)变得可用,但是命名空间std中的新类和函数却不能。
  2. 主要的风险可能是,您不再按照公认的标准进行编程,而是对编译器所发明的可能文档不足的东西进行编程。如果编译器说,在C++11模式下,它需要一个C++11标准库,而你为它提供了一个C++03标准库,那么你甚至不需要责怪编译器文档--任何事情都可能发生,你破坏了它,是你的错。

除了这种有趣的组合的风险之外,使用C++03代码库并使用任何C++11编译器编译它也有很小的风险。C++03中有一些代码结构,它们编译为C++11,但含义微妙(或完全不同)。

例如,在C++03中编写一个类几乎是可能的,在C++11中使用它时会中断,因为C++11将生成一个没有正确处理的移动构造函数。有时,您必须替换一个编译器生成的复制构造函数,它做不到正确的事情(规则三),虽然C++11确保在那些“正常”情况下移动构造函数被抑制,但也有一些奇怪的边缘情况。不幸的是我现在记不起来了。

C++11标准列出了C++11和C++03之间的一些不兼容性。你希望一切,但你知道是怎么回事。清单载于附录C。首先是:

有效的C++ 2003代码可能无法在本国际标准中编译或产生不同的结果。具体来说,名为Ru8u8RuuRUURLR的宏在与字符串文字相邻时不会展开,但将被解释为字符串文本的一部分。

从那里看不出更多引人入胜的信息。但是,它基本上是一个列表,如果它们出现在您的C++03代码库中,则需要进行更改以获得等效的C++11。

票数 5
EN

Stack Overflow用户

发布于 2012-09-12 00:45:23

没有真正的“风险”,但是C++11的很多价值来自于库。

将语言更改为C++11意味着支持C++11语言特性。如果你看一下标准,你会发现它分为语言(第1-16条)和库(第17-30条)两部分。语言功能包括语法、表达式和语句的意义、过载解析等。库功能涵盖标准标头的内容。因此,如果您需要一个特定的头来执行C++11中的某些操作,那么您可能需要一个C++11标准库。

Xcode支持gcc 4.2附带的libstdc++版本,该版本是为C++03构建的。当clang设置为C++11模式时,这很好。它还支持libc++,它旨在提供许多C++11特性,即使使用C++03编译器也是如此。因此,混合和匹配在大多数情况下都应该是很好的。但是,通过使用为彼此设计的语言和库,您将获得更大的价值。

票数 1
EN

Stack Overflow用户

发布于 2012-09-11 22:46:21

不要忘记,许多C++11语言特性都有库特性支持--例如,如果没有std::movestd::forward,就不会有太多的rvalue引用,初始化程序列表也将是垃圾。

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

https://stackoverflow.com/questions/12378300

复制
相关文章

相似问题

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