【问题标题】:How to silence long long integer constant warning from GCC如何使来自 GCC 的长整型常量警告静音
【发布时间】:2015-11-11 04:43:50
【问题描述】:

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

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

这会给编译器警告integer constant is too large for 'long' type [-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 构建。

编辑:cmets 的最小示例:

#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 后缀)出现在两者上。

【问题讨论】:

  • 我无法重现此警告,这也没有任何意义,因为为什么 -std=gnu++1z 不能提供 C++11 功能?您能否展示一个最小的工作示例并给出您使用的确切编译器版本和标志?
  • long long nanoseconds = 10; if(nanoseconds &lt; 1000000000000ll ) std::cout&lt;&lt;1000000000000ll;gcc5.2 中为我工作,带有选项-std=gnu++1z
  • 我已经用一个最小的例子和一个重现的命令行更新了这个问题。我同意在这种情况下警告使用 C++11 功能是没有意义的。
  • ((long long)1000000) * 1000000 这样的粗略解决方法怎么样?
  • @Praetorian 获得您明确要求的警告不是错误。

标签: c++ c++11 gcc gcc-warning long-long


【解决方案1】:

看来使用ll后缀时的C++11警告可能是a gcc bug。 (感谢@praetorian)

一种解决方法(受@nate-eldredge 的评论启发)是避免使用文字并在编译时使用 constexpr 生成它:

int64_t constexpr const trillion = int64_t(1'000'000) * int64_t(1'000'000);
if(nanoseconds < trillion) ...

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多