10

我正在尝试用 C++ 为 Windows(MinGW)和 Linux(g++)编写跨平台代码。我习惯在 Linux 中将 64 位整数定义为“long”,但是当我转到 MinGW 时,sizeof(long) 返回 4 个字节。然后我发现我可以在 MinGW 中使用“long long”或“__INT64”来定义 64 位整数。我有两个问题:

1.-为 Windows 和 Linux 定义 64 位整数的最便携方式是什么?我目前正在使用#ifdef,但我不知道这是否是最好的方法:

#ifdef LINUX
    #define INT64 long 
#elif WIN32
    #define INT64 long long
#endif

2.-我应该在 MinGW 中使用“long long”还是“__INT64”?为什么?

4

2 回答 2

16

您可以使用int64_t在标头中定义的类型cstdint。这是 C++11 的标准。

请注意,如果您使用的平台不支持 64 位整数,则此类型可能不存在。

至于long long,那是另一种可能。long longs 至少为 64 位宽。请注意,它也是 C++11 的标准,尽管在使用 C++03 时它可以在多个编译器上工作。

正如 Pete Becker 所说,您可以使用int_least64_t. 如果您不介意完全使用 64 位整数,但使用至少64 位宽的某些整数类型,这是一个不错的选择。

于 2013-04-09T17:43:18.677 回答
2

我相信如何获得 64 位整数的问题已得到充分回答,但我将尝试第二个问题,无论是使用“long long”还是“__INT64”。你需要首先回答的问题就是你需要的。如果出于某种原因您需要正好 64 位,请务必使用能够准确提供 64 位的东西,即 int64_t。即使您的平台/编译器没有 stdint.h,也请将您的 typedef 创建为合适的类型作为解决方法(#ifdef'd 用于编译器),因为它使您的代码更具自我记录性。另一方面,如果您正在处理例如大内存段(例如 DVD 映像)中的偏移量,请使用 size_t 或 ssize_t,因为它们通常与指针大小相同,这也是自记录的。同样,文件中的偏移量最好使用 fpos_t 表示。

顺便说一句:“long”在 Linux 中是 64 位的假设是错误的。特别是在 32 位变体上,它不是64 位,我也不确定是否真的所有 64 位变体都使用 64 位长整数。这些不同的系统称为 ILP32、LP64 和 LLP64。在网络上搜索这些术语!

于 2013-04-09T20:37:28.367 回答