我正在将一些代码从C转移到C++.在转换期间我遇到了:
uint128_t
没有命名类型
我的编译器:gcc版本5.2.1
我的操作系统:Ubuntu 15.1
这个编译好的C和我认为它将通过包括解决,stdint.h
但它没有.到目前为止,我没有尝试过其他任何事情,因为似乎没有关于此错误的大量信息(示例).uint128_t
在整个程序中使用并且对于构建是必不可少的,因此我无法删除它,并且我不确定使用不同的整数类型.
以下是使用位置和方式的示例.
union { uint16_t u16; uint32_t u32; uint128_t u128; } value;
是否可以定义uint128_t
或者我应该查看我的编译器?
GCC有类型内置支持__int128
,unsigned __int128
,__int128_t
和__uint128_t
(最后两个无证).使用它们来定义您自己的类型:
typedef __int128 int128_t; typedef unsigned __int128 uint128_t;
或者,您可以使用__mode__(TI)
:
typedef int int128_t __attribute__((mode(TI))); typedef unsigned int uint128_t __attribute__((mode(TI)));
引用文档:
TImode
"Tetra Integer"(?)模式表示十六字节整数.
十六字节= 16*CHAR_BIT> = 128.
我认为这可以通过包含来解决,
stdint.h
但尚未解决。
好吧,可能不会。
首先检查C ++标头,cstdint
来自C ++ 14,第§18.4.1章,
namespace std {..... typedef unsigned integer type uint8_t; // optional typedef unsigned integer type uint16_t; // optional typedef unsigned integer type uint32_t; // optional typedef unsigned integer type uint64_t; // optional .....
和,
标头定义与C标准中的7.18相同的所有函数,类型和宏。[..]
然后引用C11
标准第§7.20.1.1章(重点是我的)
typedef名称
uintN_t
指定具有宽度N
且没有填充位的无符号整数类型。因此,uint24_t
表示具有正好宽度的这种无符号整数类型24
。这些类型是可选的。但是,如果实现提供的整数类型的宽度为8、16、32或64位,没有填充位,并且(对于带符号的类型)具有二进制补码表示,则它应定义相应的typedef名称。
因此,在这里我们注意到两件事。
没有强制要求为固定宽度提供支持的实现int
。
64
如我们所见,Standard将宽度限制为。宽度大于标准再次规定的宽度。您需要检查所用环境的文档。