我正在尝试用C ++ for Windows(MinGW)和Linux(g ++)编写跨平台代码。我习惯在Linux中将64位整数定义为“long”,但当我移动到MinGW时,sizeof(long)返回4个字节。然后我发现我可以使用“long long”或“__INT64”在MinGW中定义64位整数。我有两个问题:
1.-为Windows和Linux定义64位整数的最便携方法是什么?我目前正在使用#ifdef,但我不知道这是否是最好的方法做到这一点:
#ifdef LINUX
#define INT64 long
#elif WIN32
#define INT64 long long
#endif
2 .- 我应该在MinGW中使用“long long”还是“__INT64”?为什么?
答案 0 :(得分:14)
您可以使用标头int64_t
中定义的cstdint
类型。这是C ++ 11的标准。
请注意,如果您使用的平台不支持64位整数,则此类型可能不存在。
至于long long
,这是另一种可能性。 long long
至少为64位宽。请注意,它在C ++ 11中也是标准的,即使它在使用C ++ 03时可以在多个编译器上运行。
如Pete Becker所述,您可以使用int_least64_t
。如果你不介意使用完全64位整数,这是一个很好的选择,但是至少 64位宽的某些整数类型。
答案 1 :(得分:2)
我认为如何获得64位整数的问题得到了充分的回答,但是我会在第二个问题上进行一次拍摄,无论是使用" long long"或" __ INT64"。您需要首先回答的问题是您需要什么。如果出于某种原因需要完全64位,那么一定要使用能够准确提供64位的东西,即int64_t。即使您的平台/编译器没有stdint.h,也可以将typedef创建为合适的类型作为解决方法(#ifdef' d用于编译器),因为它使您的代码更加自我记录。另一方面,如果你正在处理,例如大存储段(例如DVD图像)中的偏移使用size_t或ssize_t,因为它们通常与指针的大小相同,这也是自记录的。同样,文件中的偏移量最好用fpos_t表示。
BTW:假设"长"在Linux中是64位是错误的。特别是在32位变体上,不 64位,我也不确定所有64位变体是否都使用64位长。这些不同的系统称为ILP32,LP64和LLP64。在网上搜索这些条款!