【问题标题】:g++ compiling C++11 using -Wpedantic option: Is there an option to disable only the warning about unnamed structs?g++ 使用 -Wpedantic 选项编译 C++11:是否有一个选项可以仅禁用有关未命名结构的警告?
【发布时间】:2014-07-29 15:59:42
【问题描述】:

我想保留任何其他检查 -Wpedantic 但会丢失有关未命名结构的警告 error: ISO C++ prohibits anonymous structs [-Wpedantic]

我希望能够做到以下几点:

union
{
  struct
  {
    float x, y, z, w;
  };
  struct
  {
    float r, g, b, a;
  };

  float v[4];
};

到目前为止我发现了什么

我正在使用 C++11 并使用 -std=c++11 标志进行编译。我有 read that C11 supports this feature,但我没有看到 C++11 支持它的任何提及。

我听说过-fms-extensions

我尝试了该标志,但它似乎没有任何效果(无论-fms-extensions-Wpedantic 之间的顺序排列如何)。

编辑 - 更多细节

感谢 cmets,我发现了以下内容:

我仍然想知道是否有一种方法可以启用这个 gcc 扩展(我知道的所有编译器都有)可以禁用警告。还是-Wpedantic 全部或全部?

【问题讨论】:

  • 这在 C++ 中是非法的。见stackoverflow.com/q/13138605/774499
  • @DavidHammen:显然。尽管如此,它仍然有效,并且有很多代码以这种方式使用联合来执行某种类型转换(这也是非法的)。
  • @VioletGiraffe:工会是不是有点不同,因为这样的声明确实在程序中引入了一个或多个名称?联合成员的范围与类成员不同。
  • @LightnessRacesinOrbit,@VioletGiraffe:据我所知,允许使用未命名的工会。我不确定标准对它们的描述,但它们至少在-Wpedantic 下编译得很好。 cppreference has a section on "anonymous unions"
  • 迂腐模式是迂腐的。当您使用任何类型的非标准功能时,编译器都会抱怨。可能会有人在 SO 上回答您的问题,或者您甚至可以自己解决问题,但请考虑丢弃那部分代码并用标准 C++11 编写它。您当然不想从所有这些 GCC 扩展中陷入兼容性地狱。

标签: c++ gcc c++11


【解决方案1】:

您可以暂时禁用-Wpedantic,例如,如果某些包含文件中有旧代码:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"
#include "old_header.hpp"
#pragma GCC diagnostic pop

当然,您也可以在每次使用匿名结构来限制禁用pedantic 的范围时执行此操作,但是当您这样做时,您也可以继续修复代码本身: )

【讨论】:

  • 由于看起来没有命令行方法,这似乎是要走的路。我同意在大多数情况下远离非标准行为,但是这个特定的扩展在某些应用程序中提供了一些非常方便的语法(such as a vector math library) 并且我使用的所有编译器都支持它。
猜你喜欢
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多