狡猾的旗帜做什么?

Gra*_*Guy 115 c++ gcc compiler-options

我只是想知道-fpermissiveg ++编译器中的标志是什么?我正进入(状态:

错误:获取临时[-fpermissive]的地址

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

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

cli*_*hlt 140

文档中得出:

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

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

  • 我期望比引用最高票数答案中的手册+“在知道自己在做什么之前不要使用它”更多的信息。我不需要用谷歌搜索这个。哪些不合格代码会被降级? (15认同)
  • 抱歉,伙计,无意冒犯,但是像“如果你不知道其含义就不要做某事”这样的建议是微不足道的,适合每个问题,但不能回答任何问题。 (7认同)
  • ..抱歉,但是仅仅引用手册而不进行详细说明是没有帮助的。特别是在手册非常稀疏的情况下。 (7认同)

Dav*_*rtz 47

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

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


lef*_*out 17

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

  • 语言标准不允许的东西仍然可以很好地定义.实际上几乎每个编译器都有明确定义的扩展.并不是说所有允许的情况都是如此 (2认同)

bre*_*int 6

如果您想要一个真实世界的用例,请尝试编译一个非常旧版本的X Windows - 比如,2004年左右的XFree86或XOrg,就在分裂时 - 使用gcc的"现代"(咳嗽)版本,例如4.9.3.

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

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