2012-01-12 429 views
84

我只是想知道-fpermissive標誌在g ++編譯器中做了什麼?我越來越:fpermissive標誌是做什麼的?

error: taking address of temporary [-fpermissive]

,我可以通過給-fpermissive標誌編譯器解決。

編輯: 我剛剛發現是什麼導致了臨時地址錯誤部分!我現在要解決這個問題。

回答

106

右鍵從the docs

-fpermissive
Downgrade some diagnostics about nonconformant code from errors to warnings. Thus, using -fpermissive will allow some nonconforming code to compile.

底線:不使用它,除非你知道你在做什麼!

38

-fpermissive flag會導致編譯器報告一些實際爲錯誤(但被某些編譯器允許)的事件作爲警告,即使它不符合語言規則也允許編譯代碼。你真的應該修復潛在的問題。發佈可顯示問題的最小的可編譯代碼示例。

-fpermissive
Downgrade some diagnostics about nonconformant code from errors to warnings. Thus, using -fpermissive will allow some nonconforming code to compile.

13

當你寫了一些語言標準所不允許的東西(因此不能真正成爲明確定義的行爲,這是不夠的理由),但恰好映射到一些類可執行文件,如果天真地餵給編譯引擎,那麼-fpermissive將做到這一點,而不是停止與此錯誤消息。在某些情況下,程序的行爲將與您原先的想法完全相同,但您絕對不應該依賴它,除非您有一些非常特殊的理由不使用其他解決方案。

+1

語言標準不允許的東西仍然可以很好地定義。實際上幾乎每個編譯器都有明確定義的擴展。儘管如此,並不是說所有情況都是這樣 – MikeMB 2017-07-17 06:43:30

4

如果你想要一個真實世界的用例,試着編譯一個非常舊的版本的X Windows--比如XFree86或者是2004年前的XOrg,就在分裂的周圍 - 使用「現代」(咳嗽)版本的gcc,比如4.9.3。

您會注意到構建CFLAGS同時指定了「-ansi」和「-pedantic」。從理論上講,這意味着「如果有的話甚至略微違反了語言規範就會炸燬」。實際上,3.x系列的gcc並沒有抓到太多的東西,用4.9.3構建它會在地面留下一個抽菸洞,除非你將CFLAGS和BOOTSTRAPCFLAGS設置爲「-fmissiveive」。

使用該標誌,大多數C文件將實際構建,讓您可以自由移動到詞法分析器將生成的依賴於版本的殘骸。 =]