【问题标题】:How do I suppress the "ISO C++ does not support ‘__int128’ warning?如何抑制“ISO C++ 不支持‘__int128’警告?
【发布时间】:2019-07-06 00:55:12
【问题描述】:

我正在用 gcc 编译我的代码,使用 -Wall -Wextra -Wpedantic 开关和非扩展标准集(比如 -std=c++14)。但是 - 我想对该规则做一个例外并使用__int128。这给了我一个警告:

warning: ISO C++ does not support ‘__int128’ for ‘hge’ [-Wpedantic]

我可以隐藏关于__int128 的特定警告吗?或者,我可以在使用这种类型之前和之后暂时抑制-Wpedantic吗?

【问题讨论】:

  • 您是否添加了-std= 标志来选择特定的C++ 标准?请告诉我们您传递给编译器的所有标志。
  • @Someprogrammerdude:已编辑。
  • 我做了更多的实验。最初的答案有点混乱,因为正确使用 __extension__ 有点不直观。答案通过简单的解决方案进行了修正。
  • 使用-std=c++14,您可以告诉编译器更严格地遵守 C++ 标准,而无需 GCC 扩展。尝试例如-std=gnu++14 改为启用 GCC 扩展。
  • @Someprogrammerdude:我想要遵守 C++ 标准。 gnu++14 将允许与标准相矛盾的代码,而 __int128 未标准化,但 AFAICT 是“合法”扩展。

标签: c++ gcc compiler-warnings int128


【解决方案1】:

如果我们咨询documentation for -Wpedantic,我们可以注意到以下内容:

__extension__ 后面的表达式中也禁用了迂腐警告。

快速的bit of experimentation 表明这允许人们按预期定义变量,即使在标志下:

__extension__ __int128 hge{};

但是,如果我们打算经常使用这种类型,那当然会相当麻烦。使这不那么棘手的方法是使用类型别名。虽然我们在这里需要小心,但__extension__ 属性必须在整个声明之前

__extension__ typedef __int128 int128;

你可以看到它在here工作。


另一种方法,一种遵循您最初思路的方法,是在类型别名周围使用诊断编译指示:

namespace my_gcc_ints {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"
    using int128 = __int128;
#pragma GCC diagnostic pop
}

还有works rather well

【讨论】:

    猜你喜欢
    • 2019-11-30
    • 2011-12-28
    • 1970-01-01
    • 2019-02-25
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多