2015-08-25 76 views
5

我们使用模板特针对某些类型的参数一样unsigned long long与uint64_t的冲突?

class my_template_class<uint64_t M>: public my_template_class_base<uint64_t> { 
.... 
} 

class my_template_class<unsigned long long,M>: public my_template_class_base<unsigned long long> { 
.... 
} 

这是用64位编译使用gcc完美的工作。而当我们尝试32位模式时,它会报告上面两类的“以前的定义”。

因此unsigned long long与32位编译中的uint64_t相同,但不支持64位编译?

编译区别是CXX标志-m32-m64

+5

@FrédéricHamidi:不太可能;我从来没有见过一个128位“unsigned long long”的系统。 –

+0

uint64_t实际编译成什么?我没有GCC方便,但你可以检查stdint标题。可能会给出一些关于编译器实际所见的线索。 – BlamKiwi

+1

我很确定,在64位平台上,'uint64_t'被定义为'unsigned long',因此不会与'unsigned long long'冲突,而在32位平台上,'uint64_t'必须是'unsigned长长',产生你的错误 – NiBZ

回答

12

所以unsigned long long是在32位编译在64位编译相同uint64_t但不?

是。

在32位模式下,最有可能的是long是32位,而long long是64位。在64位模式下,两者可能都是64位。

在32位模式下,编译器(更精确地说<stdint.h>头)限定uint64_t作为unsigned long long,因为unsigned long不够宽。

在64位模式下,它将uint64_t定义为unsigned long

可能在两种模式下都将其定义为unsigned long long。选择是任意的;所需要的只是它必须是64位类型。

通常,<stdint.h>中定义的每个整数类型都是具有适当特征的某种预定义类型的typedef。你不能认为它们中的任何一个都不同于预定义的类型。

+0

在Windows上,'uint64_t'必须被定义为'unsigned long long'只要32位https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models –

+0

@LưuVĩnhPhúc:它被定义为'__uint64 '在过去。通常没有指定具有相同表示的两种类型实际上是否是相同的类型; “char”与“signed char”或“unsigned char”的例外是定义它们构成3种类型和2种表示。 – MSalters

+0

@MSalters:要清楚,所有预定义的类型都是不同的,无论它们的表示如何。例如,即使它们具有相同的大小和表示,“int”和“long”也是不同的类型。如果你指的是在标准头文件中定义的类型,比如'int32_t',那么你是对的。 –

4

这是stdint.h为GCC 4.8:

#if __WORDSIZE == 64 
typedef unsigned long int uint64_t; 
#else 
__extension__ 
typedef unsigned long long int uint64_t; 
#endif 

所以:

所以无符号长长是在32位compliation在64位compliation一样uint64_t中但不?

是。

+0

是的,对于GCC。不要以为这是真的无处不在。例如Visual Studio有一个无条件'typedef unsigned long long uint64_t;' – MSalters

相关问题