4

Xcode IDEでは、C言語の方言を次のいずれかに設定するオプションがあります。

  • ANSI C
  • GNU89
  • C89
  • GNU99
  • C99
  • コンパイラのデフォルト

ANSI Cを除いて、それらの意味を理解しています。私が知っているように、ANSICはC89またはC99の1つにすぎません。しかし、そこにあるのには理由があるはずです。そこにANSICが指定する用語は何ですか?

4

4 に答える 4

6

編集クレジットは、XCodeのC方言選択ウィンドウからスクリーンショットを投稿するために@Nicholas Knightに送られます: http ://dl.dropbox.com/u/14571816/xcodelang.png

ANSI Cは、歴史的に、ANSI C89規格(実質的にはC90と同じもの)を指します。-ansiXCodeは、CコードをコンパイルするためのコンパイラバックエンドとしてGCCのバージョンを使用します。そのため、フラグを指定しstd=てCコンパイラバックエンドが動作するモードを選択できるため、これらの「オプション」を取得できると思います。コードをコンパイルするため。

したがって、これを渡して-ansiCコンパイラを使用すると、と同等になります。-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拡張機能は無効になっています)。-ansiCコードと同じです。


これらの引数は同等です。

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という名前は非推奨になりました。

于 2011-03-15T15:36:52.833 に答える
1

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 用のコンパイラではありません)。

于 2011-03-15T15:28:39.090 に答える
1

コンパイラには、ターゲットとする言語のプロファイルがあります。pmg が返信で述べたように、ANSI C は最も初期のプロファイルの 1 つであり、K&R の本に記載されています。

興味深い問題は、なぜコンパイラがレガシー言語プロファイルのリストを維持するのかということです。ANSI C プロファイルに対してコードを記述することは、実質的にすべてのコンパイラ (より重要なのはコンパイラのバージョン) でコードが機能することを非常に強力に保証するためです。

ソフトウェア プロジェクトが ANSI-C 互換性を主張するとき、彼らはどこでもギブ オア テイクでコンパイルできると言っています。Lua のソース コードはその一例です。

于 2011-03-15T15:35:14.933 に答える
0

実際、コンパイラとして GCC を使用していると仮定すると、ANSI と C89 は同じもののエイリアスです。見る:

http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options

Apple がなぜ両方を提示するという設計上の決定を下したのか、私にはわかりません。GCC には実質的な区別はありません。-ansi の意味が GCC の新しいバージョン (おそらく C99) で変更された場合に備えて、おそらく彼らは妄想的です。

于 2011-03-15T15:40:09.527 に答える