fpermissive标志的作用是什么?


121

我只是想知道该-fpermissive标志在g ++编译器中的作用是什么?我正进入(状态:

错误:使用临时地址[-fpermissive]

我可以通过将-fpermissive标志提供给编译器来解决 。

编辑:我只是找到了导致临时地址错误部分的原因!我现在要修复该部分。

Answers:


146

文档开始

-fpermissive
将有关不合格代码的某些诊断从错误降级为警告。因此,使用-fpermissive将允许编译一些不合格的代码。

底线:除非您知道自己在做什么,否则请不要使用它!


4
我希望获得比引用手册更多的信息+“从投票最多的答案中使用它,除非您知道自己在做什么”。我不必为此谷歌。哪些情况下的不合格代码会被完全降级?
johannes_lalala

不会将不合格的代码降级,但是诊断是从错误到警告。开题器给出了一个例子。如果您不知道边缘情况可能是什么,则不应该考虑使用它。
cli_hlt

2
抱歉,没有冒犯,但“不知道后果就不要做”之类的建议是微不足道的,适用于每个问题,不会回答任何问题。
johannes_lalala

3
..很抱歉,但仅引用手册而不作任何详细说明都没有帮助。特别是在手册非常稀疏的情况下。
johannes_lalala

50

-fpermissive标志使编译器将某些实际上是错误的东西(但某些编译器允许)报告为警告,以允许代码编译,即使它不符合语言规则。您确实应该解决潜在的问题。发布最小的,可编译的代码示例来说明问题。

-fpermissive
将有关不合格代码的某些诊断从错误降级为警告。因此,使用-fpermissive将允许编译一些不合格的代码。


18

当您编写了语言标准不允许的内容(因此不能真正定义良好的行为,这是足够不这样做的理由)时,如果天真地将其映射到某种可执行文件,然后,编译引擎-fpermissive将执行此操作,而不是停止此错误消息。在某些情况下,该程序的行为将与您最初打算的完全相同,但是除非您有非常特殊的理由不使用其他解决方案,否则您绝对不应依赖它。


3
仍然可以很好地定义语言标准所不允许的某些内容。实际上,几乎每个编译器都有定义明确的扩展。不是说这是与宽容的,虽然所有实例的情况下
MikeMB

8

如果您需要一个真实的用例,请尝试使用gcc的“现代”(咳嗽)版本编译非常旧的X Windows版本(例如,大约2004年左右的XFree86或XOrg) ,例如4.9.3。

您会注意到构建CFLAGS同时指定了“ -ansi”和“ -pedantic”。从理论上讲,这意味着“炸毁任何东西甚至会稍微违反语言规范”。在实践中,3.x系列的gcc并没有捕获太多此类内容,并且使用4.9.3进行构建会在地面上留下一个烟囱,除非将CFLAGS和BOOTSTRAPCFLAGS设置为“ -fpermissive”。

使用该标志,大多数这些C文件将实际生成,使您可以自由地继续进行该词法分析器将生成的版本相关的残骸。=]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.