簡體   English   中英

我應該使用“-ansi”或顯式“-std = ...”作為編譯器標志嗎?

[英]Should I use “-ansi” or explicit “-std=…” as compiler flags?

我已經讀過 ANSI C與ISO C不完全相同,編譯器可能對“-ansi”的解釋有所不同。 (gcc將其映射到C90,clang將其映射到C89)目前我傾向於使用“-std = ...”而不是“-ansi”,因為它明確地顯示了使用哪個標准。 由於我特別感興趣的是在Linux,Windows和MAC上編譯,我擔心一些編譯器無法理解“-std = ...”而是“-ansi”。 那么使用一個在另一個上有任何利弊嗎?

如果您希望編譯器強制執行1989 ANSI C標准,或者等同於1990 ISO C標准(它們描述完全相同的語言),則可以安全地使用-ansi-std=c89

嚴格來說,名字-ansi是不正確的; 它指的是1989 ANSI C標准,但ANSI本身認為該標准已經過時; 它被1999年的ISO C標准(ANSI在發布后不久正式采用)取代,該標准本身已經或很快將被新的2011 ISO C標准所取代。 但是改變-ansi選項的含義會破壞太多的Makefile和構建腳本。

gcc 4.7及更高版本還將-std=c90識別為-std=c89的同義詞。 gcc 4.7於2012年3月發布,所以-std=c90是合理的便攜式,除非您需要允許舊版本的gcc。

-std=c99強制執行(大部分)1999 ISO C標准。 由於Microsoft特別不支持C99(即使在這些年之后),使用此選項意味着編譯器不會警告您使用其他地方可能不支持的C99特定功能。 這里記錄了 gcc的C99支持。

gcc 4.7 部分支持新的ISO C 2011標准, -std=c11 該支持在以后的版本中有所改進,但尚未完成。 這里記錄了 gcc C11狀態,據說與C99支持的級別相似。

有更多選項,以及我提到過的一些別名; 例如,在1999 ISO標准最終確定之前添加了選項-std=c9x ,它仍然受支持; 類似地, -std=c1x-std=c11的同義詞。

我相信clang旨在盡可能與gcc兼容,所以它應該支持具有相同含義的相同選項(除了一些較新的選項,取決於你使用的gcc和clang的版本)。

gcc手冊有完整的詳細信息, 一個部分描述了支持的標准, 另一個部分指定了各種-ansi-std=...選項。 鏈接是4.7版本。 您還可以運行info gcc (如果您安裝了GNU info命令和gcc文檔),或者您可以在此處查看該手冊的多個版本。

如果您打算使用除gcc之外的編譯器(以及旨在兼容gcc的編譯器),您必須閱讀他們的文檔以了解如何強制執行各種版本的C標准。

-ansi-std=編譯器標志可以由其他編譯器共享,但它們是gcc標志。

截至目前-ansi相當於gcc -std=c89 ,但這可能1)將來改變所以我建議你使用-std=c89 over -ansi 事實上,ISO c99也已獲得ANSI批准。

您應該注意到c89和c90基本上是相同的C標准。 c89是ANSI名稱,而c90是ISO名稱。

來自gcc 頁面

這些出版物之間沒有技術差異,盡管ANSI標准的部分重新編號並成為ISO標准中的條款。 從其批准之日起,該標准通常稱為C89,或偶爾稱為C90。


1)正如Keith Thompson在評論中指出的那樣,即使它可能不太可能,因為它會破壞許多構建腳本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM