GCC在-std = gnu ++ 0x和-std = c ++ 0x之间有什么区别?应该使用哪一个?

Meh*_*Meh 27 c++ android gcc compiler-options c++11

<stdint.h>在使用-std=c++0xGCC 4.4.3(适用于Android)时遇到麻烦:

// using -std=c++0x
#include <stdint.h>
uint64_t value;  // error: 'uint64_t' does not name a type
Run Code Online (Sandbox Code Playgroud)

但使用-std=gnu++0x作品:

// using -std=gnu++0x
#include <stdint.h>
uint64_t value;  // OK
Run Code Online (Sandbox Code Playgroud)

<stdint.h>使用C++ 0x中不兼容?

Ste*_*sop 20

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

这就是为什么,指的是n3225的预期行为-std=c++0x:

D.7说

每个C头,每个头都有一个名称为name.h的行为,就好像每个由相应的cname头放在标准库命名空间中的名称放在全局命名空间范围内

好的,到目前为止这么容易.<cstdint>标准库命名空间中的位置是什么?

18.4.1:

typedef unsigned integer type uint64_t; // optional
Run Code Online (Sandbox Code Playgroud)

如何选择?18.4.1/2:

标题定义了所有函数,类型和宏,与C标准中的7.18相同

讨厌鬼.C标准说什么?取出n1256,7.18.1.1/3:

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

但是坚持下去,肯定在Android上使用-std=c++0xGCC 确实提供了64位无符号类型,没有填充位:unsigned long long.因此<cstdint>需要提供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最终都可能会切换到最终.