如何使用 -Werror 忽略 gcc 的 "useless storage class"?

How to ignore "useless storage class" with gcc using -Werror?

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

我想使用 -Werror 标志,我不想更正 third-party 包。有没有办法忽略这个警告?

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

产生错误的代码行是带有 "dangling" typedef 的结构定义。

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

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

编辑:解决方案

尽管我接受了 Florian Weimer 的回答,因为它最接近地回答了问题,但它并不是我最终解决的实际问题。我将在下面描述。通过将 headers 包含为系统 headers,我做了我想做的事情 - 无需修复包即可抑制错误。

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

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

# on build time
git apply package.h.patch

所有警告和错误都有特定的名称,并且可以在 per-warning/-error 的基础上启用或禁用。

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

的消息
/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, more specifically in the warning options documentation

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

我假设您想从要启用 -Werror.

的文件中包含 package.h

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

但是,您可以将头文件放在单独的目录中,而不是使用 -I 将其添加到包含路径,而是使用 -isystem。因此,头文件被视为系统头文件,除非您还使用 -Wsystem-headers 进行编译,否则系统头文件中的警告将被抑制。