2013-07-05 47 views
3

爲什麼-ansi和-std = C++ 11不能一起工作? (根據其他答案,ANSI恢復爲C++ 98) 我正在使用g ++ - 4.8。g ++爲什麼-ansi和-std = C++ 11衝突?

這裏是ANSI批准的C++ 11:

http://webstore.ansi.org/RecordDetail.aspx?sku=INCITS%2fISO%2fIEC+14882-2012

這讓我困擾。 謝謝!

+5

由於新標準的批准並未導致gcc標誌的含義發生變化。 –

+0

但是標誌明確地以標準命名,不是嗎? –

+5

是的,至少是原來的。改變現有標誌的含義雖然很棘手 - 可能(可能會)打破了大量現有的makefile等等。 –

回答

8

RTFM

-ansi
在C模式,這相當於-std=c89。在C++模式下,它相當於-std=c++98

該標誌在該標準有多個版本之前添加,並且該標誌仍具有相同的含義。

爲什麼你要同時使用這兩個?如果你想-std=c++11然後使用它,不要添加另一個標誌,意味着別的矛盾。

+0

我真的不想同時使用這兩個,但我修改了在makefile中加入了-ansi標誌的代碼,添加了一些C++ 11的優點,起初我只在標誌中添加了-std = C++ 11 ,但不知道它會被-ansi反擊。 –

+0

是的,RTFM +1 – Sheljohn

2

他們只是旗幟的名字。最好避免調用任何「ANSI」,因爲1.它們標準化了很多東西,2.舊標準定期更新並進行有意義的更改,3.它們沒有涉及我意識到的任何計算機語言,而是作爲一些國際組織的成員參與,如C++,ISO。

當告訴編譯器你想要什麼標準化的語言方言時,指定它的標準化年份,或者它唯一的假設就是你想要第一個(最老的)標準。最初的標準化是唯一的一個時間點,指定年份時不會導致歧義。

說到歧義,根據documentation,-ansi是唯一的語言標誌,其含義取決於調用GCC。 gcc -ansi表示C89,而g++ -ansi表示C++ 03。就我個人而言,我更喜歡比較聰明的模糊性。

2

是的。這與C++中的C++一樣:ANSI已經採用(幾乎是自動)ISO C標準出現的每個版本,包括C11:http://webstore.ansi.org/RecordDetail.aspx?sku=INCITS%2fISO%2fIEC+9899-2012。每個新標準都「取代並取代」較早的標準,正如你注意到的,官方的ANSI標準是C11和C++ 11,而早期版本不再是有效的法則。 ANSI標準是當前的ISO標準。

所以,如果你想讀--ansi標誌作爲表明ANSI目前採用的標準,那將是完全沒有必要的。

取而代之,C和C++上下文中的術語「ANSI」用於指在添加後面的功能之前,該語言的第一個標準化版本。這只是一種習俗,並且和所有習俗一樣,不必具有字面意義。這很方便,因爲有些人(通常是偶然的C或C++用戶)對標準組織的工作不太瞭解,並且認爲ANSI的最後C標準確實是1989年的標準。那些人將依靠--ansi標誌,而我們其他人使用正確的年份標籤標準。

相關問題