如何消除GCC提示的长整型常量警告

5

我有一些使用大整数字面量的代码,如下:

if(nanoseconds < 1'000'000'000'000)

这会给编译器警告:整数常量对于'long'类型太大 [-Wlong-long]。然而,如果我将其改为:

if(nanoseconds < 1'000'000'000'000ll)

我却收到了警告信息use of C++11 long long integer constant [-Wlong-long]

我希望仅针对这一行禁用该警告,但不能禁用整个项目中的-Wlong-long或使用-Wno-long-long。我已经尝试将其用以下方式包围:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wlong-long"
...
#pragma GCC diagnostic pop

但在这里似乎不起作用,同时出现了此警告。我还有其他可以尝试的方法吗?

我正在使用-std=gnu++1z进行构建。

编辑:评论区提供了最小示例:

#include <iostream>
auto main()->int {
  double nanoseconds = 10.0;
  if(nanoseconds < 1'000'000'000'000ll) {
    std::cout << "hello" << std::endl;
  }
  return EXIT_SUCCESS;
}

使用g++ -std = gnu++1z -Wlong-long test.cpp进行构建会出现test.cpp:6:20: warning: use of C++11 long long integer constant [-Wlong-long]警告。需要说明的是,这是在32位平台上,使用MinGW-w64(gcc 5.1.0)的Windows系统上运行的 - 第一个警告似乎不会出现在我64位Linux系统上,但第二个警告(使用ll后缀)会在两个系统上出现。

1
我无法重现这个警告,而且这也毫无意义,因为为什么 -std=gnu++1z 不能使用 C++11 的功能呢?您能否展示一个最小可行的示例,并提供您使用的确切编译器版本和标志? - 5gon12eder
我已经更新了问题,提供了一个最小化的示例和一个命令行来重现。我同意在这种情况下警告使用C++11特性是没有意义的。 - Riot
((long long)1000000) * 1000000 这样的粗略解决方法怎么样? - Nate Eldredge
@Praetorian 这很有趣 - 这个 bug 已经被报告了吗?我找不到任何提及它的信息。 - Riot
2
@Praetorian,得到你明确请求的警告并不是一个bug。 - user743382
显示剩余4条评论
1个回答

3
似乎在使用ll后缀时,C++11警告可能是gcc的一个错误。(感谢@praetorian)一个解决方法(受到@nate-eldredge评论的启发)是避免使用字面量,并通过constexpr在编译时生成它:
int64_t constexpr const trillion = int64_t(1'000'000) * int64_t(1'000'000);
if(nanoseconds < trillion) ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接