web-dev-qa-db-ja.com

GNU99とC99(Clang)の違いは何ですか?

コンパイラオプションGNU99およびC99を見ました。それらの違いは何ですか?詳細なドキュメントはありますか? (Clang、Xcode、Mac OS X)

53
Eonil

さまざまな標準モードの違い

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オプションを使用して、どのモードでも有効にできます。

その他のリンク

43
Matt Joiner

C99はストレートC99、GNU99はgnu拡張付きのC99です。 GCC manpage を参照してください。

18
Paul R

C99は、誰もが知っているように、1999年時点のC標準の単なるバージョンです。 GCCでは完全にサポートされていません。

GNU99はC99の拡張であり、GNU98はC98の拡張です。ドキュメントから:

ISO C99 plus GNU extensions。ISO C99がGCCで完全に実装されると、これがデフォルトになります。gnu9xという名前は廃止されます。

Clangはこれらの拡張機能もサポートしています。

10
user142019