如何使用 #pragma 和 gcc 选择性地禁用 -Werror

Posted

技术标签:

【中文标题】如何使用 #pragma 和 gcc 选择性地禁用 -Werror【英文标题】:How to selectively disable -Werror using #pragma with gcc 【发布时间】:2015-10-29 12:59:33 【问题描述】:

在寻求无警告应用程序的过程中,我开始使用-Werror 告诉 GCC 将所有警告视为错误。

这确实很有帮助,因为有时我会在大型构建输出中错过一两个(严重)警告。 不幸的是,我的项目使用 SQLite 3,其中包含许多警告,如 SQLite 网站所述,无法消除(他们不想删除)。

我想知道是否有办法使用一些 #pragma 我可以放置在 sqlite3.c 文件中告诉 GCC 停止仅将警告视为错误文件。

我试过了:

#pragma GCC diagnostic ignored "-Werror"

没有成功。

我还尝试一一列出导致问题的警告:

#pragma GCC diagnostic ignored "-Wextra"
#pragma GCC diagnostic ignored "-Wfloat-equal"
#pragma GCC diagnostic ignored "-Wundef"
...

...不幸的是,有些警告无法完全关闭(即,初始化会丢弃来自指针目标类型的限定符)。

我能做什么?

【问题讨论】:

相关:***.com/questions/32049296/…***.com/questions/58956003/…***.com/questions/3378560/… 【参考方案1】:

您可以为 sqlite3.c 添加一个额外的规则到您的 Makefile 中,该规则在没有 -Werror 或根本没有任何警告的情况下编译文件。按照通常的约定,这样的事情可能就足够了:

sqlite3.o: sqlite3.c
    $(CC) $(CFLAGS) -w -c sqlite3.c

【讨论】:

我想到了,不幸的是我正在使用autoconf / automake ...而且它已经很乱了。在 ./configure 期间选择了警告(和 -Werror),因此我可以在为主机目标构建调试版本时启用它。然后在为目标(嵌入式 Linux)系统构建时禁用警告。 @fabrizi0 用automake为特定文件添加额外规则应该没问题。不过,我对此没有经验,您可能需要查阅其文档以了解具体操作方法。还请考虑将其标记为automake 并编辑您的问题以指出您想要一种方法来禁用-Werror 或为一个文件提供-w,如果您想收到该行的答案。 FUZxxl:不幸的是,我怀疑 automake 不支持每个对象标志,只支持每个目标标志)。正如这篇文章中提到的那样:***.com/questions/149324/…。如果我没有在每个文件上找到任何好的方法,我将不得不创建一个 sqlite 库并将我的应用程序链接到它。

以上是关于如何使用 #pragma 和 gcc 选择性地禁用 -Werror的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用#pragma 警告?

如何使用#pragma 警告禁用 CA1814?

可以将 GCC 配置为忽略 #pragma 指令吗?

Visual中#pragma comment(user)和gcc中#pragma Comment的目的

如何在 gcc 的特定部分中放置一组变量,arm 是不是有类似 #pragma default_variable_attributes 的东西

在gfortran中使用“pragma GCC优化”