用于Windows和Linux的C ++中64位整数的跨平台定义

时间:2013-04-09 17:41:04

标签: c++ cross-platform mingw long-integer int64

我正在尝试用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”?为什么?

2 个答案:

答案 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。在网上搜索这些条款!