如何使用-Werror忽略gcc的“无用存储类”?

时间:2017-10-23 17:16:01

标签: c gcc pragma

我用-Werror编译我的项目,以确保我的所有代码都没有可识别的警告。但是,我当前的项目有一个第三方依赖项,其中存在一个导致警告的问题 - 由于-Werror标志,该警告因构建而失败。

我想使用-Werror标志,我不想更正第三方软件包。有没有办法忽略这个警告?

package.h:126:1: error: useless storage class specifier in empty declaration [-Werror]
 };

生成错误的代码行是带有“悬空”typedef的结构定义。

typedef struct my_data_obj {
  char* data;
  uint32_t data_size;
};

这显然是一个错误 - 但我找不到任何pragma或任何此类机制来忽略该头文件生成的警告。有什么想法吗?

编辑:解决方案

虽然我接受Florian Weimer的答案,因为它最接近问题的答案并不是我解决的实际问题。我会描述下面的吼叫。通过将标题包含在系统标题中,我完全按照自己的意愿执行操作 - 无需修复包即可抑制错误。

我最终做的是创建一个补丁文件,并在每次构建项目时简单地应用该补丁。

vim package.h
# fix the file
git add package.h
git diff --cached > package.h.patch

# on build time
git apply package.h.patch

2 个答案:

答案 0 :(得分:3)

我假设您要在要启用.Build()的文件中加入package.h

GCC没有单独的标志来控制此警告,否则编译器会打印它。使用单独的标志,您可以使用-Werror,如其他答案中所示,可能使用包装头文件。

但是,您可以将头文件放入单独的目录中,而不是使用#pragma GCC diagnostics ignore将其添加到包含路径,而是使用-I。因此,头文件被视为系统头,除非您还使用-isystem进行编译,否则系统头中的警告将被禁止。

答案 1 :(得分:-1)

所有警告和错误都有特定的名称,可以在每个警告/错误的基础上启用或禁用。

例如,假设我有一个未使用的变量并启用了有关它的警告,那么我将收到类似于

的消息
/some/path/main.cpp:18:9: warning: unused variable ‘i’ [-Wunused-variable]

消息的最后一部分,即方括号内的部分,是特定警告的名称。

使用此名称,您可以使用-Wno-<name of warning>选项禁用警告。如果出现上述警告,则会-Wno-unused-variable禁用。

您的用例与不同,因为您要禁用变为错误的警告。这与上面的内容非常相似,但选项的一般形式是-Wno-error=<name of warning or error>。在我们的示例中,它是-Wno-error=unused-variable

所有这些当然是in the GCC documentation,更具体地说是in the warning options documentation

所以你需要做的就是找出警告的名称,这样你就可以将它用于-Wno-error=选项。