我维护一个应该在多个平台上运行的开源库,并提供(以及其他)本机数据类型的数学例程。我们希望尽可能提供64位计算。
我们的目标平台是32位和64位的Linux和OSX,Windows尚不支持,但大多数代码已知可以在Windows下运行,因此我们可以轻松地移植到Windows中。遥远的未来。因此,对于http://en.cppreference.com/w/cpp/language/types,我们对ILP32,LLP64和LP64感兴趣。
我们还与gmp(仅为int
和long
提供构造函数,但不为long long
进行交互。)
我们现在遇到的问题归结为我们使用哪种原生整数类型作为我们的数字类型的默认值:
int
,我们会在64位平台上回退到32位。long
,我们在Linux / OSX 64与Windows 64之间的行为会有不一致:Windows将无法使用64位计算。long long
,使用gmp会变得一团糟,因为从mpz_class
创建long long
会导致模糊的重载。我们必须预先将这些数字转换为长数(因此在许多地方仅在Windows上有效地使用32位。)std::int64_t
之类的,那么typedef在平台之间有所不同,因此我们会遇到同样的问题,每个平台只有不同的问题... 那是否有某种最佳做法? 是否可以避免这些问题或者它们是C ++类型系统固有的?
当然,问题不会在这里结束。需要考虑的其他未决问题:
std::size_t
进行互动? std::size_t
有它的目的,但有时需要与我们计算的数字进行交互。显然,我们不想一直来回演绎。f(T)
并为T = int,long,long long
提供重载但用户将其与std::int64_t
一起使用,我们是否可以避免不同平台之间的不一致行为? (具有std::int64_t
的不同定义)如果我们还为std::int64_t
提供重载,我们将有重复的重载。PS:我已阅读c-long-long-int-vs-long-int-vs-int64-t和should-i-use-long-long-or-int64-t-for-portable-code。我对那里究竟发生了什么以及为什么会这样,但无法得出解决方案有了一些见解......
答案 0 :(得分:0)
根据定义,您的Windows上的gmp永远不会支持64位值。因此,我建议您在代码中使用int64_t
,并且只要您需要先将static_cast
gmp与long
进行交互,就可以随时使用RewriteLog "/tmp/debug.log"
RewriteLogLevel 6
。