在GCC中,我如何禁用“-fpermissive”警告?

27

我正在包含一个来自第三方库的文件,该文件会引发一个错误,使用-fpermissive可以将其降级为警告。但是,由于我不想在编译日志中“污染”这些警告,我希望完全禁用这些消息。

到目前为止,当包含这个文件时,我使用诊断预处理指示符设置了-fpermissive选项,类似于:

#pragma GCC diagnostic push
#pragma GCC diagnostic warning "-fpermissive"

#include <third-party-file.h>

#pragma GCC diagnostic pop

由于GCC通常提供-f标志的“正”和“负”版本,因此我考虑忽略“no-permissive”功能:

#pragma GCC diagnostic ignored "-fno-permissive"
#include <third-party-file.h>

但似乎没有-fpermissive标志的“负面”版本(我正在使用GCC 4.6.3;但即使是版本4.7.0也没有这个选项)。

我能模仿这种行为吗?


3
-fno-permissive 是默认选项。-fpermissive 和不设置选项是该标志的“负面”和“正面”版本。尽管如此,您不应使用它。修复代码!即使代码不是你自己写的。 - rubenvb
3
“-fno-permissive”不是默认选项,因为该选项不存在。如果该选项存在,其行为将成为默认选项。我可以修复代码,但这似乎更像是一种解决方法...... 无论如何,修复整个包含的标头集合并不是一个真正可行的选项。 - piwi
1
这正是我想表达的。-fpermissive 是这里的hack/解决方法。我们正在谈论哪些代码呢?也许有更好的替代方案。 - rubenvb
我知道我不应该使用标志,但我必须使用这个库;它已经被深度使用:转换到另一个选项不是一个选择。考虑到上下文,我想修复头文件是可以的。 - piwi
3
我已经在GCC中提交了一个回归错误报告:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81787 - o11c
2个回答

20

简而言之:在GCC 4.7之后,您无法关闭-fpermissive输出。


我只是在这里发布一下,以便更多人看到: 不幸的是,zwol的答案(虽然出于善意,对于那些使用较旧的GCC版本的人可能有帮助)不适用于更近期的GCC版本。从GCC 4.8及以上版本开始,您无法关闭fpermissive输出。o11c在他的评论中给出了以下有用的错误跟踪信息: Bug 81787. [5/6/7/8 Regression] #pragma GCC diagnostic warning "-fpermissive" no longer 请注意,它处于“RESOLVED INVALID”状态,因此无法关闭它是预期的行为,也没有计划改变它。

4
哼。我对不允许关闭这个功能的论点并不感到印象深刻。“改变了C++语言的含义”,“将有关不符合规范代码的诊断降级为警告”,无异是同义反复。 - zwol

14
这可能有点晚了,但其中一个应该能满足你的要求:
#pragma GCC diagnostic ignored "-fpermissive"

或者

#pragma GCC diagnostic ignored "-pedantic"

“忽略”是完全消除一项诊断的方法,而与历史原因相关的“-fpermissive”的反义词是“-pedantic”。

1
谢谢您的回复!您知道在哪里可以找到关于-pedantic-fpermissive的反义词的提及吗? - piwi
1
很不幸,这并没有被清晰地记录下来。你可以在这里阅读有关-fpermissive的信息:http://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/C_002b_002b-Dialect-Options.html#index-fpermissive-154,以及有关`-pedantic`的信息:http://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/Warning-Options.html#index-pedantic-257。如果你仔细阅读,你可能会明白正在发生的事情是C++编译器将`-pedantic-errors`作为其默认状态。但是,如果没有指向实际代码的证据,我无法向您证明这一点... - zwol
他们的版本控制系统没有在线交叉引用索引,所以我无法在下载所有代码并运行一堆“grep”之前找到相关的实际代码部分。很抱歉,今天早上我没有时间这样做。 - zwol
没问题,无论如何感谢你!我最终会尝试你的解决方案,看看它是否有助于解决我的问题。 - piwi
@clearlight:你可以这样包装它:#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-pedantic"
// 这里是产生警告的代码
#pragma GCC diagnostic pop (每个语句都在自己的一行上,很抱歉格式不好)
- gg99
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接