138

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

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

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

编辑:我刚刚发现导致临时地址错误部分的原因!我现在要修复那部分。

4

5 回答 5

163

在文档中

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

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

于 2012-01-12T23:24:53.407 回答
62

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

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

于 2012-01-12T23:24:30.600 回答
20

当您编写了语言标准不允许的内容时(因此不能真正成为明确定义的行为,这有足够的理由不这样做)但如果天真地馈送到某种可执行文件,则碰巧映射到某种可执行文件编译引擎-fpermissive就会这样做,而不是停止并显示此错误消息。在某些情况下,程序将完全按照您最初的预期运行,但您绝对不应该依赖它,除非您有非常特殊的理由不使用其他解决方案。

于 2012-01-12T23:32:39.000 回答
15

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

您会注意到构建 CFLAGS 指定了“-ansi”和“-pedantic”。从理论上讲,这意味着“如果有任何轻微违反语言规范的内容,就会炸毁”。在实践中,3.x 系列的 gcc 并没有捕捉到太多这种东西,并且用 4.9.3 构建它会在地上留下一个冒烟的洞,除非你将 CFLAGS 和 BOOTSTRAPCFLAGS 设置为“-fpermissive”。

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

于 2016-07-29T05:14:44.817 回答
2

存在一个简单设置 -fpermissive 而不出汗的常见情况:经过彻底测试和工作的第三方库,如果没有 -fpermissive,它将无法在较新的编译器版本上编译。这些库是存在的,而且很可能不是应用程序开发人员要解决的问题,也不是在开发人员的计划预算中要做的。

设置 -fpermissive 并在这种情况下继续。

于 2020-12-24T03:51:34.210 回答