如何编写可移植代码来跨不同平台(MacOS 和 Ubuntu)比较常量整数值与 int64_t 变量?
int64_t a = 2;
std::min(1, a);
1L
作为常量值时,无法在 MacOS 上编译。1LL
在 Ubuntu 20.04 上也无法编译。我发现 INT64_C 作为一个潜在的解决方案,但文档不清楚。
int64_t a = 2;
std::min(1, a); // error (unless int64_t is int)
用
1
替换 INT64_C(1)
可能会“起作用”,但不能保证。 INT64_C
宏扩展为 int_least64_t
类型的表达式。这可能与 int64_t
是同一类型,但不能保证。例如,如果 long
和 long long
都是 64 位,则 int_least64_t
可能是 long
并且 int64_t
可能是 long long
。实现没有太多理由以不同的方式定义它们,但您不应该依赖于此。
它是这样定义的,因为在大多数情况下,
int_least64_t
类型的常量在需要int64_t
值的上下文中可用,因为它可能会被提升。 std::min
的参数是一个例外;您需要一个实际上属于 int64_t
类型的表达式。
没有定义
int64_t
类型文字的语法。但是您可以通过使用转换来获得该类型的常量表达式:
int64_t a = 2;
std::min(int64_t(1), a);
或者您可以定义一个正确类型的常量并使用它来代替文字:
std::int64_t a = 2;
constexpr int64_t one = 1;
std::min(one, a);