33

私が使用したいくつかのコンパイラ (gccさまざまなバージョンを除くすべて)では、 for ループ式の前ではなく内部でC99 mode宣言するなどのエラーが発生しますint i(オプションを使用しないstd=c99場合)。ここを読んだ後、gccオプション-ansi-std=c89、および-std=iso9899:1990すべてが ANSI C 標準に評価されることを理解しましたが、標準と新しい標準(これが私が想定している最新のもの) を選択する必要があるかどうかがわかりません。c89c99

また、C 言語の型標準には複数のバージョンがありますが、isoそのうちの最初のもの (私の理解では) は ANSI 標準の直接のポートです。 Cの標準を更新すると言っても安全ですがiso、Cの元のANSI標準は常に同じですか?

おまけの質問:

私は実際にこれを自分で理解することができます.私はまだそれをするのに時間がかかっていないので、誰かが頭の上で知っていればそれは素晴らしいことです.

私はその本のかなり新しい印刷物を持っていますThe C Programming Language (ANSI)。私の本は常に次のように for ループを表示します:

int i;

for(i = 0; i < foo; i++)

しかし、多くの人 (ほとんどの場合、小指にプログラミングの才能がある人) は、for ループを次のように記述します。

(int i = 0; i < foo; i++)

最初の方法でループを記述しiた場合、関数全体にアクセスできるはずですが、2 番目の方法で記述した場合、コンパイルする標準に関係iなく for ループにのみアクセスできるというのは正しいですか? この同じ質問を別の方法でc89行うと、標準でコンパイルすると、i両方の for ループが関数全体にアクセスできるようになり、c99標準でコンパイルするとi、最初の for ループが関数全体にアクセスできるようになりますがi、 2 番目の for ループは、for ループのみからアクセスできますか?

4

4 に答える 4

22

c89標準とc99のような新しい標準(私が想定している最新のもの)を選択する必要がある理由/場合がわかりません。

いくつかの理由:

1) gcc の C99 サポートは完全ではありませんが、C89 サポートは完全です。そのため、C89 (GNU 拡張機能付き) がデフォルトです。したがって、gcc を使用した標準へのプログラミングに絶対的なこだわりがある場合は、C89 を選択してください。

2) Microsoft のコンパイラは、実際には C99 をまったくサポートしていません。したがって、移植可能な C コードを作成する場合は、C89 が一般的な標準です。

iso は C の標準を更新すると言っても安全ですが、C の元の ANSI 標準は常に同じでしょうか?

いいえ、ISO C99 は ANSI 標準としても承認されました。C89 だけに「ansi」という名前が付けられたのは、不幸な歴史的事故です。とはいえ、C89 は常に C89 であり、最新の ANSI C 標準ではありません。

最初の方法でループを記述した場合、関数全体にアクセスできるはずですが、2 番目の方法で記述した場合、コンパイルする標準に関係なく、for ループにのみアクセスできるというのは正しいですか?

C89 では 2 番目の方法 (つまり、標準に準拠する) で記述できないため、-pedantic「どの標準に関係なく」ということはありません。GNU 拡張機能を備えた C のバージョンは標準ではなく、「方言」です (少なくともマニュアル ページではそう呼んでいます)。C89 では、2 番目のループは正当ではありません。C99 では、2 番目iのループはスコープをループに限定します。どちらの場合も明らかに、最初のループはiより広い範囲を提供します。

実際、gcc は、GNU 拡張機能が有効になっている場合でも、C89 の 2 番目のループを好みません。

于 2010-09-24T02:37:19.493 に答える
22

C は ANSI によって C89 として標準化されました。その後、ISO によって C90 として標準化されました。C89 と C90 の間に技術的な違いはありません。

C99 は C 標準の改訂版です。ISO C 委員会によって開発され、ISO と ANSI の両方によって標準化されました。C89 と C99 はどちらも ANSI 標準です。一般的な用語では、「ANSI C」という語句は通常 C89 を指します。K&R第2版。この本は C99 ではなく、C89 のみをカバーしています。

古いバージョンの C を使用することを選択した理由は何ですか? まあ、少なくとも2つの理由があります。まず、C99 をサポートしていないコンパイラを使用している可能性があります (たとえば、Microsoft Visual C++ は C89 のみをサポートしています)。第二に、C99 では許可されていない C89 のものを使用する多くのレガシー コードがあります ( 「C99 後方互換性」の質問で詳細を確認できます。違いについて説明している C99 の根拠ドキュメントにもリンクしています)。

「おまけの質問」ですが、C89 では for ステートメントで変数を宣言することはできません。C99でできます。C89 では、for ステートメントの最初の部分は式です。

于 2010-09-24T02:20:29.250 に答える
3

C 標準についての詳細な説明はありません。

しかし、私のデフォルトのスタンスは、機会があれば C99 を使用することです。最新に開発された規格だったことも一因です(「新しいほうがいい」という偏見を持っています)。

主な理由は、for ループで変数を宣言できるようにするためです。

C99 有効:

for (int i = 0; i < 100; i++)
{
   doSomething();
}

C89、ANSI 以前:

int i;
for (i = 0; i < 100; i++)
{
   doSomething();
}
于 2010-09-24T03:16:39.930 に答える
1

gccのC99 実装はまだ完成していませんが、日常のプログラマーの生活ではかなり便利です。参考文献は手元にありませんが、gcc については、この実装が終了したと見なされる日に C99 (または単に方言 gnu99) に切り替えるという声明がどこかにあります。

C99 機能を使用するかどうかの問題は、実用的な部分に分かれています。

  • コードをコンパイルする必要があるプラットフォーム
  • どのような機能が得られますか (私の好みでは、多くのクリーンさと移植性の高いプログラムの容易さ)

そして感情的/イデオロギー的な部分。後者については、恐竜の原理を適用する以外に治療法はありません。

于 2010-09-24T06:34:59.500 に答える