【发布时间】:2012-09-10 04:50:41
【问题描述】:
我有一个用 C 和 C++ 编写的开源代码库。我正在寻找一种保证 至少 64 位宽的整数类型,它可以在大多数 OS X(英特尔,64 位)和具有开源 C 的 Linux 机器上可靠地编译和 C++ 编译器,最终用户无需做太多额外的工作。 Windows 和 32 位客户端支持目前并不重要。
我在 OS X 上做了一些测试,开发者工具附带的最新 GCC 不支持 C+11 模式(因此似乎不能保证long long 的可用性)。 Clang 也不支持这个,虽然它支持 long long 如果启用 C99 模式,在某个版本之后。
当可移植性是一个重要目标时,一般建议是否使用int64_t 代替long long?使用格式说明符似乎很痛苦。
我能否可靠地将int64_t 转换为long long(以及与uint64_t 等效的unsigned)以将其与以long long 作为参数的现有函数和库一起使用? (当然又回来了。)
在这种情况下,如果我发布的代码需要 Clang 功能而不是 GCC,那么 Clang 会取代 GCC 作为 Linux 上的首选编译器吗?在向最终用户提供源代码时,大部分情况下我可以期待那个编译器吗?
基本上,我想向其他使用这两种类型的可移植 C 和 C++ 代码的开发人员征求一些建议,考虑到上述情况,他们可能会对什么可能是更好的长期发展方式提出一些建议牢记目标。
【问题讨论】:
-
gcc 在 c++11 之前有
long long作为扩展,所以只要你不禁用 gcc-extensions 你应该可以在 gcc 上使用long long(其实我不'认为我已经使用/看到过长时间不提供 long long 的编译器)。 -
请注意,
int64_t可以具有基础类型long或long long等,如果需要重载,可能会导致可移植性问题。 -
还可以考虑使用 typedef 来轻松地在平台之间进行更改。
-
需要考虑的一点是,使用
int64_t的重载或模板可能会在不同的系统上选择不同的版本。见this other question on int64_t vs long vs long long
标签: c++ c types int64 long-long