1

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

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

我曾尝试在谷歌上搜索以了解可能的含义,但结果却一无所获。

我的问题是:

  1. 改变clang中的语言方言甚至意味着什么?
  2. 做这样的事情有什么风险?
4

4 回答 4

5

我不使用 XCode,但我想如果他们为 clang 提供(可能不完整但到达那里)C++11 模式,那么他们也会提供(可能不完整但到达那里)C++11 标准图书馆。并一起测试它们。所以你的情况不应该出现,但假设它无论如何:

  1. 从形式上讲,它没有任何意义,因为该标准不承认任何混合和匹配“语言”和“库”的方式。这取决于你的编译器它认为它意味着什么。这可能意味着新的“语言特性”(如右值引用、lambda 等)变得可用,但命名空间中的新类和函数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 代码可能无法编译或在本国际标准中产生不同的结果。具体来说,名为R, u8, u8R, u, uR, U,UR或的宏LR在与字符串文字相邻时不会被扩展,但将被解释为字符串文字的一部分。

并且从那里阅读并没有更多引人入胜的读物。但它基本上是一个列表,如果它们出现在您的 C++03 代码库中,需要更改才能获得等效的 C++11。

于 2012-09-11T22:30:44.670 回答
1

没有真正的“风险”,但 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 编译器也是如此。因此,混合和匹配在大多数情况下应该可以正常工作。但是,通过使用为彼此设计的语言和库,您将获得更多价值。

于 2012-09-12T00:45:23.710 回答
0

不要忘记,许多 C++11 语言特性都由库特性支持——例如,如果没有 and ,你将不会有太多的右值引用使用std::movestd::forward而且初始化列表也会是垃圾。

于 2012-09-11T22:46:21.017 回答
0

GCC 和 clang 编译 c++ 略有不同。这可能对您的情况没有影响,但在其他人的情况下可能会,因此您可以切换回 GNU 风格的编译。因此,“语言方言”。

只要您将语言和标准库设置为 GNU 版本,它就不会产生影响。但是在 GNU 方言中使用 Apple LLVM 编译器(clang)进行编译可能不会产生与在 Windows 上相同的结果(假设您在两者上都使用 GCC)。我想说除非您在两个平台上都使用匹配的库、编译器和设置,否则您总是处于某种风险之中,尤其是当第 3 方库开始发挥作用并且您将 libstdc++ 换成 libc++ 以获得 C++11 支持时。

如果你在 Windows 上使用 VC++,它对 C++11 的支持相当缺乏,所以当你的 XCode 代码拒绝在 VC++ 中构建时不要感到惊讶。

于 2012-09-12T02:34:22.717 回答