【问题标题】:What's the difference in GCC between -std=gnu++0x and -std=c++0x and which one should be used?-std=gnu++0x 和 -std=c++0x 之间的 GCC 有什么区别,应该使用哪一个?
【发布时间】:2011-07-05 09:04:11
【问题描述】:

在 GCC 4.4.3(适用于 Android)中使用 -std=c++0x 时,我遇到了 <stdint.h> 的问题:

// using -std=c++0x
#include <stdint.h>
uint64_t value;  // error: 'uint64_t' does not name a type

但是使用-std=gnu++0x 可以:

// using -std=gnu++0x
#include <stdint.h>
uint64_t value;  // OK

&lt;stdint.h&gt; 与 C++0x 不兼容吗?

【问题讨论】:

    标签: android c++ gcc c++11 compiler-options


    【解决方案1】:

    据我所知,我认为这可能是一个实现错误(或者实际上,由于 C++0x 没有发布,这不是一个错误本身,而是一个不完整的实现即将出台的标准的当前状态)。

    原因如下,参考 n3225 了解 -std=c++0x 的预期行为:

    D.7 说

    每个 C 标头,每个标头都有一个 形式 name.h 的名称,表现得好像 每个名字都放在标准中 库命名空间由相应的 cname 标头放置在 全局命名空间范围

    好的,到目前为止很容易。 &lt;cstdint&gt; 在标准库命名空间中放置了什么?

    18.4.1:

    typedef unsigned integer type uint64_t; // optional
    

    如何可选? 18.4.1/2:

    标题定义了所有函数, 类型和宏同 7.18 in C标准

    德拉特。 C标准是怎么说的?取出n1256、7.18.1.1/3:

    这些类型是可选的。然而, 如果实现提供整数 宽度为 8、16、32 或 64 的类型 位,没有填充位,并且(对于 签名类型)具有 二进制补码表示,它 应定义相应的 typedef 名字

    但请稍等,在带有-std=c++0x GCC 确实 的 Android 上肯定会提供没有填充位的 64 位无符号类型:unsigned long long。所以&lt;cstdint&gt; 需要提供std::uint64_t,因此stdint.h 需要在全局命名空间中提供uint64_t

    继续,有人告诉我为什么我错了 :-) 一种可能性是 C++0x 指的是“ISO/IEC 9899:1999 编程语言 - C”,但没有指定版本。真的是 (a) 7.18.1.1/3 被添加到其中一个 TC 中,而且 (b) C++0x 打算参考 1999 年的原始标准,而不是此后的修订吗?我怀疑其中任何一种情况,但我手头没有原始的 C99 来检查 (a),我什至不知道如何检查 (b)。

    编辑:哦,至于应该使用哪个-std=c++0x 还不是真正的严格标准兼容模式,因为还没有严格的标准。即使有标准,gcc 4.4.3 也肯定不是它的完整实现。因此,如果-std=gnu++0x 实际上更完整,我认为没有必要使用它,至少在这方面对于您的 gcc 版本和平台的组合而言。

    但是,gnu++0x 将启用您可能不希望您的代码使用的其他 GNU 扩展。如果你的目标是编写可移植的 C++0x,那么最终你会想要切换到-std=c++0x。但我认为 GCC 4.4 或任何其他正在进行中的 C++0x 实现还不够完整,以至于从(草案)标准编写代码是可行的,这样你就可以板着脸说“我'我正在编程 C++0x,而这只是 2011 年!”。所以我想说,使用任何一个有效的,并理解你现在使用的任何一个,你最终可能会切换到-std=c++11

    【讨论】:

    • 使用 GCC 4.6 的 NDK 8b 存在同样的问题。
    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多