Meh*_*Meh 27 c++ android gcc compiler-options c++11
我<stdint.h>
在使用-std=c++0x
GCC 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++0x
GCC 确实提供了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
最终都可能会切换到最终.