天天看點

【一通百通】C/C++的std标準總結

  C/C++發展很多版本标準,sunsky(本人)早就想理理std标準了,讓大家有個清晰的了解。

适用C(或C源代碼,如C ++,Objective-C和Objective-C ++)的标準:

-ansi

在C模式下,這相當于 -std = c90的。在C ++模式下,相當于-std = c ++ 98的。

這将關閉不相容的與ISO C90(編譯時C代碼),或标準的C ++(編譯C ++時代碼)GCC的某些特征,如asm與typeof關鍵字,以及預定義的宏如unix和vax辨別系統的類型你正在使用。它也可以使用不希望的和很少使用的ISO三聯圖特征。對于C編譯器,它禁用C ++風格的識别//'評論以及inline關鍵字。

該替代關鍵字__asm__,__extension__, __inline__和__typeof__繼續,盡管工作 -ㄧ的。當然,您不希望在ISO C程式中使用它們,但将它們放在可能包含在編譯完成的頭檔案中是有用的-ㄧ。備用的預定義宏,如__unix__和__vax__也可用,有或沒有-ㄧ的。

的 -ㄧ選項不會導緻非ISO程式被無償地拒絕。為了那個原因,-Wpedantic 除了需要 -ㄧ。請參閱警告選項。

宏__STRICT_ANSI__是預定義的-ㄧ 選項被使用。某些頭檔案可能會注意到此宏,并且不要聲明某些功能或定義ISO标準不要求的某些宏; 這是為了避免幹擾可能使用這些名稱的其他任何程式。

通常内置但不具有ISO C(如alloca和ffs)定義的語義的函數不是内置函數-ㄧ用來。請參閱GCC提供的其他内置功能,了解影響功能的詳細資訊。

-std=

确定語言标準。有關這些标準版本的詳細資訊,請參閱GCC支援的語言标準。當選擇編譯C或C ++時,此選項目前才被支援。

編譯器可以接受幾個基本标準,如“c90' 要麼 'c ++ 98'和這些标準的GNU标準,如“gnu90' 要麼 'gnu ++ 98'。當指定基準标準時,編譯器接受遵循該标準的所有程式,以及使用不違反基準标準的GNU擴充。例如, -std = c90關閉那些不符合ISO C90 GCC的某些功能,比如asm和typeof 關鍵字,而不是其他GNU擴充沒有在ISO C90意義,如省略的中期?: 表現。另一方面,當指定了标準的GNU标準時,編譯器支援的所有功能都被啟用,即使這些功能改變了基本标準的含義。是以,一些嚴格的程式可能會被拒絕。特定标準被使用-Wpedantic識别哪個特性是标準版本的GNU擴充。例如 -std = gnu90 -Wpedantic 警告C ++風格'//“評論,而 -std = gnu99 -Wpedantic 才不是。

必須提供此選項的值; 可能的值是

“c90“

“c89“

“iso9899:1990“

支援所有ISO C90程式(與ISO C90沖突的某些GNU擴充禁用)。與...一樣-ㄧ 為C代碼。

“iso9899:199409“

修改1中修改的ISO C90。

“c99“

“c9x“

“iso9899:1999“

“iso9899:199x“

ISO C99。此标準基本上完全支援,模數錯誤和浮點問題(主要是但不完全與附件F和G中的可選C99功能完全相關)。見 http://gcc.gnu.org/c99status.html以擷取更多資訊。名字 'c9x'和'iso9899:199x“已被棄用。

“c11“

“c1x“

“iso9899:2011“

ISO C11,ISO C标準的2011修訂版。該标準基本上完全支援,模數錯誤,浮點問題(主要但不完全與附件F和G中的可選C11特性相關)和可選附件K(界限檢查接口)和L(可分析性)。名字 'c1x“已被棄用

“gnu90“

“gnu89“

GNU标準ISO C90(包括一些C99功能)。

“gnu99“

“gnu9x“

GNU标準ISO C99。名字 'gnu9x“已被棄用

“gnu11“

“gnu1x“

GNU标準ISO C11。這是C代碼的預設值。名字 'gnu1x“已被棄用

“c ++ 98“

“c ++ 03“

1998年ISO C ++标準加上2003年的技術更正和一些其他缺陷報告。與...一樣-ㄧ 用于C ++代碼。

“gnu ++ 98“

“gnu ++ 03“

GNU标準 -std = c ++ 98的。

“c ++ 11“

“c ++ 0x“

2011年ISO C ++标準加上修改。名字 'c ++ 0x“已被棄用

“gnu ++ 11“

“gnu ++ 0x“

GNU标準 -std = c ++ 11的。名字 'gnu ++ 0x“已被棄用

“c ++ 14“

“c ++ 1y“

2014年ISO C ++标準加上修改。名字 'c ++ 1y“已被棄用

“gnu ++ 14“

“gnu ++ 1y“

GNU标準 -std = c ++ 14的。這是C ++代碼的預設值。名字 'gnu ++ 1y“已被棄用

“c ++ 1z“

ISO C ++标準的下一次修訂,暫定于2017年。支援是高度實驗性的,在将來的版本中幾乎肯定會以不相容的方式發生變化。

“gnu ++ 1z“

GNU标準 -std = c ++ 1z的。支援是高度實驗性的,在将來的版本中幾乎肯定會以不相容的方式發生變化。

  

總結:

  目前來看,c/c++的89/11是最流行的,其實就是實用,有産生力。至于之前的古董,隻能說除了相容性好,幾乎沒其他的優勢了。

  另外,請大家請注意下,C幾乎上不再更新了,慢慢轉向C++的統一(這話是國外c/cpp論壇的),大家有空多關注C++14/17的發展吧,新特性還是能振奮人心的。

謀膽并重

繼續閱讀