狡猾的旗帜做什么?

时间:2012-01-12 23:21:03

标签: c++ gcc compiler-options

我只是想知道{+ 1}}标志在g ++编译器中的作用是什么?我得到了:

  

错误:获取临时[-fpermissive]

的地址

我可以通过向编译器提供-fpermissive标志来解决这个问题。

修改: 我刚刚发现导致临时地址错误的部分!我现在要修理那个部分。

4 个答案:

答案 0 :(得分:134)

the docs开始:

  

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

底线:不要使用,除非你知道自己在做什么!

答案 1 :(得分:43)

-fpermissive flag使编译器报告一些实际上是错误的东西(但是被一些编译器允许)作为警告,以允许代码编译,即使它不符合语言规则。你真的应该解决潜在的问题。发布证明问题的最小,可编译的代码示例。

  

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

答案 2 :(得分:15)

当你写了一些语言标准不允许的东西时(因此不能真正定义明确的行为,这是不能做到这一点的原因)但是恰好映射到 some < / em>可执行文件如果天真地提供给编译引擎,那么-fpermissive将执行此操作而不是停止此错误消息。在某些情况下,程序将按照您最初的预期运行,但除非您有一些非常特殊的理由不使用其他解决方案,否则您绝对不应该依赖它。

答案 3 :(得分:6)

如果您想要一个真实世界的用例,请尝试编译一个非常旧版本的X Windows - 比如,从2004年开始,在分裂的XFree86或XOrg中,使用“现代”(咳嗽) gcc的版本,例如4.9.3。

您会注意到构建CFLAGS同时指定“-ansi”和“-pedantic”。从理论上讲,这意味着,“如果有任何事情甚至略微违反语言规范,那就会爆炸”。在实践中,3.x系列的gcc没有捕捉到这种东西,并且用4.9.3构建它会在地面留下吸烟洞,除非你将CFLAGS和BOOTSTRAPCFLAGS设置为“-fpermissive”。 / p>

使用该标志,大多数C文件将实际构建,让您可以自由地转移到词法分析器将生成的依赖于版本的残骸。 =]