コンパイラオプションGNU99およびC99を見ました。それらの違いは何ですか?詳細なドキュメントはありますか? (Clang、Xcode、Mac OS X)
clangは、clangが使用する言語モードを変更する-stdオプションをサポートしています。 Cでサポートされているモードは、c89、gnu89、c94、c99、gnu99およびこれらのモードのさまざまなエイリアスです。 -stdオプションが指定されていない場合、clangはデフォルトでgnu99モードになります。
すべてのc *モードとgnu *モードの違い:
- c *モードは
__STRICT_ANSI__
を定義します。- 「linux」のように、アンダースコアが前に付いていないターゲット固有の定義は、gnu *モードで定義されます。
- トライグラフは、gnu *モードではデフォルトでオフになっています。
-trigraphs
オプションで有効にできます。- パーサーは、gnu *モードで「asm」および「typeof」をキーワードとして認識します。バリアント
__asm__
および__typeof__
は、すべてのモードで認識されます。- Apple "blocks"拡張は、一部のプラットフォームのgnu *モードでデフォルトで認識されます;
-fblocks
オプションを使用して、どのモードでも有効にできます。
C99はストレートC99、GNU99はgnu拡張付きのC99です。 GCC manpage を参照してください。
C99は、誰もが知っているように、1999年時点のC標準の単なるバージョンです。 GCCでは完全にサポートされていません。
GNU99はC99の拡張であり、GNU98はC98の拡張です。ドキュメントから:
ISO C99 plus GNU extensions。ISO C99がGCCで完全に実装されると、これがデフォルトになります。gnu9xという名前は廃止されます。
Clangはこれらの拡張機能もサポートしています。