我有一个开源代码库,用 C 和 C++ 编写。我正在寻找一种至少保证宽度为 64 位的整数类型,可以在大多数 OS X(Intel,64 位)和 Linux 系统的开源 C 和 C++ 编译器上可靠地编译,而不需要用户做太多额外的工作。目前不需要支持 Windows 和 32 位客户端。
我在 OS X 上进行了一些测试,最新的 developer tools 自带的 GCC 不支持 C+11 模式(因此似乎不能保证 long long
可用)。Clang 也不支持这个模式,尽管在某个版本之后启用 C99 模式可以支持 long long
。
当可移植性是一个重要目标时,一般建议使用 int64_t
代替 long long
吗?使用格式说明符似乎很麻烦。
我能否可靠地将 int64_t
强制转换为 long long
(以及使用带有 unsigned
的 uint64_t
的等效方式),以便将其与现有函数和库一起用于接受 long long
作为参数的情况?(当然必须还原回去。)
在这种情况下,如果我发布需要 Clang 功能而 GCC 不支持的代码,那么 Clang 是否会取代 GCC 成为 Linux 的首选编译器?当提供源代码给终端用户时,我是否可以大多数情况下期望使用这个编译器?
基本上,我想向其他开发人员请教一些建议,他们已经在可移植 C 和 C++ 代码中使用了这两种类型,并可能对考虑以上目标时哪种方式更好有一些建议。
long long
作为扩展功能。只要您不禁用gcc扩展,使用long long
应该没有问题(实际上,我认为我很长时间以来都没有使用/看到过不提供long long
的编译器)。 - Grizzlyint64_t
可以具有底层类型long
或long long
等,如果需要重载可能会导致可移植性问题。 - Mark Bint64_t
的重载或模板可能会在不同的系统上选择不同的版本。请参见int64_t vs long vs long long上的另一个问题。 - Bo Persson