Xcode IDEでは、C言語の方言を次のいずれかに設定するオプションがあります。
- ANSI C
- GNU89
- C89
- GNU99
- C99
- コンパイラのデフォルト
ANSI Cを除いて、それらの意味を理解しています。私が知っているように、ANSICはC89またはC99の1つにすぎません。しかし、そこにあるのには理由があるはずです。そこにANSICが指定する用語は何ですか?
編集クレジットは、XCodeのC方言選択ウィンドウからスクリーンショットを投稿するために@Nicholas Knightに送られます: http ://dl.dropbox.com/u/14571816/xcodelang.png
ANSI Cは、歴史的に、ANSI C89規格(実質的にはC90と同じもの)を指します。-ansi
XCodeは、CコードをコンパイルするためのコンパイラバックエンドとしてGCCのバージョンを使用します。そのため、フラグを指定しstd=
てCコンパイラバックエンドが動作するモードを選択できるため、これらの「オプション」を取得できると思います。コードをコンパイルするため。
したがって、これを渡して-ansi
Cコンパイラを使用すると、と同等になります。-std=c90
これもまたはと同等-std=c89
です-std=iso9899:1990
。
-ansi
Cモードでは、これはと同等
-std=c90
です。C ++モードでは、と同等-std=c++98
です。
また、フラグを使用する場合は、-std
特定の値を渡してさまざまな言語機能をアクティブにすることができます。
-std=
言語標準を決定します。このオプションは現在、CまたはC++をコンパイルする場合にのみサポートされています。
これらの引数は同等です。
c90
c89
iso9899:1990
すべてのISOC90プログラムをサポートします(ISO C90と競合する特定のGNU拡張機能は無効になっています)。-ansi
Cコードと同じです。
これらの引数は同等です。
iso9899:199409
修正1で修正されたISOC90。
これらの次の引数は同等です。
c99
c9x
iso9899:1999
iso9899:199x
ISOC99。この標準はまだ完全にはサポートされていないことに注意してください。詳細については 、http: //gcc.gnu.org/gcc-4.5/c99status.htmlを参照してください。名前c9xおよびiso9899:199xは非推奨になりました。
これらの次の引数は同等です。
gnu90
gnu89
ISO C90のGNU方言(一部のC99機能を含む)。これはCコードのデフォルトです。
これらの次の引数は同等です。
gnu99
gnu9x
ISOC99のGNU方言。ISO C99がGCCに完全に実装されると、これがデフォルトになります。gnu9xという名前は非推奨になりました。
Cは70年代に「生まれ」ました。
1978 年に Brian Kernighan と Dennis Ritchieが本を出版しました。この本 (初版) に記載されている言語は、現在 "K&R C" と呼ばれています。
1988年頃に第2版が発行されました。この第 2 版は、ANSI (ISO) 標準に非常によく似ており、この本を参照するときに人々が通常話題にする版です:)
コンパイラの作成者は言語に変更を加え始め、それを標準化するために、ANSI は 1989 年に標準 (C89 標準または ANSI C) を発行しました。これは、ANSI にほとんど変更を加えない ISO 標準 (C90) にすぐに続きました。
1999 年に、ISO は別の C 標準を発行しました。これは C99 と呼ばれるものです。
したがって、私が正しければ、ANSI C は数か月しか最新ではありませんでしたが、ANSI C と ISO C90 の違いはごくわずかです。実際、今日の多くのコンパイラは、追加機能を備えた ANSI C 用のコンパイラです (追加機能を備えた ISO C99 用のコンパイラではありません)。
コンパイラには、ターゲットとする言語のプロファイルがあります。pmg が返信で述べたように、ANSI C は最も初期のプロファイルの 1 つであり、K&R の本に記載されています。
興味深い問題は、なぜコンパイラがレガシー言語プロファイルのリストを維持するのかということです。ANSI C プロファイルに対してコードを記述することは、実質的にすべてのコンパイラ (より重要なのはコンパイラのバージョン) でコードが機能することを非常に強力に保証するためです。
ソフトウェア プロジェクトが ANSI-C 互換性を主張するとき、彼らはどこでもギブ オア テイクでコンパイルできると言っています。Lua のソース コードはその一例です。
実際、コンパイラとして GCC を使用していると仮定すると、ANSI と C89 は同じもののエイリアスです。見る:
http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options
Apple がなぜ両方を提示するという設計上の決定を下したのか、私にはわかりません。GCC には実質的な区別はありません。-ansi の意味が GCC の新しいバージョン (おそらく C99) で変更された場合に備えて、おそらく彼らは妄想的です。