我应该使用 INT64_C 作为“int64_t 文字”...?

问题描述 投票:0回答:1

如何编写可移植代码来跨不同平台(MacOS 和 Ubuntu)比较常量整数值与 int64_t 变量?

int64_t a = 2;
std::min(1, a);
  • 当我使用
    1L
    作为常量值时,无法在 MacOS 上编译。
  • 使用
    1LL
    在 Ubuntu 20.04 上也无法编译。

我发现 INT64_C 作为一个潜在的解决方案,但文档不清楚。

c++ literals int64
1个回答
0
投票
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);
© www.soinside.com 2019 - 2024. All rights reserved.