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

标签 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 的回答,因为它最接近地回答了问题,但这并不是我所解决的实际问题。我将在下面描述。通过将 header 包含为系统 header ,我做了我想做的事情 - 无需修复包即可抑制错误。

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

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

# on build time
git apply package.h.patch

最佳答案

我假设您想从要启用 -Werror 的文件中包含 package.h

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

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

关于c - 如何使用 -Werror 忽略 gcc 的 "useless storage class"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46894986/

相关文章:

c - 在 C 中使用头文件

perl - 我应该使用命令行开关或编译指示打开 Perl 警告吗?

c - #pragma init 和 #pragma fini 在 linux 上使用 gcc 编译器

mysql - 段错误问题,gdb 消息

gcc - 打印没有许可证/版权信息的 GCC 版本

linux - 如何将版本信息嵌入到共享库和二进制文件中?

c++ - 如何使用#pragma message() 使消息指向文件(lineno)?

C 风格类型注解与其他注解

c++ - 父进程发生了什么?

c - 用于 Ubuntu 14.04 的 C 中的 UINPUT 设备程序不起作用。为什么?