43

我有一个用 C 和 C++ 编写的开源代码库。我正在寻找一种保证至少64 位宽的整数类型,它可以在大多数 OS X(英特尔,64 位)和具有开源 C 和 C++ 编译器的 Linux 机器上可靠地编译,而无需太多最终用户的额外工作。Windows 和 32 位客户端支持此时并不重要。

我在 OS X 上做了一些测试,开发者工具附带的最新 GCC 不支持 C+11 模式(因此似乎不能保证long long. Clang 也不支持这个,虽然它支持long long如果 C99 模式启用,在某个版本之后。

当可移植性是一个重要目标时,一般建议使用int64_t代替吗?long long使用格式说明符似乎很痛苦。

我可以可靠地将一个int64_tto long long(同样与 with 的unsigned等价物uint64_t)一起使用以将它与long long作为参数的现有函数和库一起使用吗?(当然,又回来了。)

在这种情况下,如果我发布的代码需要 Clang 功能而不是 GCC,那么 Clang 会取代 GCC 作为 Linux 上的首选编译器吗?在向最终用户提供源代码时,大多数情况下我可以期待那个编译器吗?

基本上,我想向其他将这两种类型用于可移植 C 和 C++ 代码的开发人员征求一些建议,考虑到上述目标,他们可能会对什么可能是更好的长期方式提出一些建议.

4

3 回答 3

35

类型long longunsigned long long是标准 C 和标准 C++ 类型,每个类型至少有 64 位。我知道的所有编译器都提供这些类型,除非可能在某种-pedantic模式下,但在这种情况下int64_t,或者uint64_t在 C++ 2011 之前的编译器中也不可用。在所有系统<stdint.h>上也都可用。也就是说,据我所知,你如何拼写类型并不重要。的主要目标<stdint.h>是为特定位数提供最佳匹配。如果您至少需要 64 位,但您还想利用这种类型的快速实现,您可以使用int_least64_tor uint_least64_tfrom <stdint.h>or <cstdint>(如果是后者,名称在 namespace 中定义std)。

于 2012-09-17T23:15:11.703 回答
30

当可移植性是一个重要目标时,一般建议使用int64_t代替吗?long long

int64_t如果编译器提供但不提供,我会感到非常惊讶long long

如果long long存在,它必须至少有 64 位,所以从(u)int64_tto 转换(unsigned) long long是保值的。

如果你需要一个正好是64 位的类型,使用(u)int64_t,如果你需要至少64 位,(unsigned) long long就可以了,就像(u)int_least64_t.

于 2012-09-17T23:12:26.847 回答
-1

使用 int64_t。int64_t 表示 64 位,无论您走到哪里,都会得到 64 位。long long 实际上与 long 一样依赖于实现。也就是说,long long 必须大于或等于 long,但这可能因编译器和平台而异。

于 2020-05-11T14:43:19.963 回答