質問
私が使用した複数のコンパイラで(すべて gcc
しかし、さまざまなバージョン)私は取得します C99 mode
宣言するなどのエラー int i
それ以前ではなく、ループ式の式の内側(私が使用しない場合 std=c99
オプション)。読んだあと ここ 私はそれを理解しています gcc
オプション -ansi
, -std=c89
, 、 と -std=iso9899:1990
すべてがANSI C標準に評価されます、 しかし、私は理由を理解していません/私が選ぶべきなら c89
標準対新しい標準のような c99
(これは私が想定している最新です)。
また、複数のバージョンが表示されます iso
c言語の標準のタイプ。最初の(私の理解から)は、ANSI標準の直接ポートです。 それを言うのは安全です iso
Cの標準を更新しますが、Cの元のANSI標準は常に同じですか?
ボーナス質問:
私は実際にこれを自分で理解することができます、私はまだそれをするのに時間をかけていないので、誰かが頭の一番上で知っているなら、それは素晴らしいです、そうでなければ大物ではありません、私はそれを後で理解します:)
私は本のかなり新しいプリントを持っています The C Programming Language (ANSI)
. 。私の本は常にこのようなループのために表示されます:
int i;
for(i = 0; i < foo; i++)
しかし、多くの人々(ほとんどの人が小指でより多くのプログラミングの才能を持っています)は、このようなループを書いています。
(int i = 0; i < foo; i++)
ループを最初に書くかどうかを言うのは正しいですか i
関数全体にアクセスできるはずですが、2番目の方法で書くと i
forループにのみアクセスできます 関係なく どの標準をコンパイルしますか?私がコンパイルした場合、これと同じ質問をする別の方法 c89
標準は次のとおりです i
両方のループの両方の機能全体にアクセス可能になり、私がコンパイルした場合 c99
標準は次のとおりです i
ループの最初のものは関数全体にアクセスできますが、 i
2番目のループは、forループのみでアクセスできますか?
解決
C99のような新しい標準(これが最新のものです)と比較して、C89標準を選択する必要がある理由がわかりません。
いくつかの理由:
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のバージョンは標準ではなく、「方言」です(少なくともそれはMan Pageが呼んでいるものです)。 C89では、2番目のループは合法ではありません。C99では、2番目のループが i
ループに。明らかに、どちらの場合も、最初のループが与えます i
より広いスコープ。
実際、GCCはGNU拡張機能が有効になっていても、C89の2番目のループが好きではありません。
他のヒント
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 Rationaleドキュメントにもリンクしています)。
「ボーナスの質問」に関しては、C89のforステートメントで変数を宣言することはできません。 C99ではできます。 C89では、forステートメントの最初の部分は表現です。
C基準について詳細な説明はありません。
しかし、私のデフォルトのスタンスは、チャンスが与えられたときにC99を使用することでした。それが最新の開発された標準であるという事実は、1つの理由です(「Newerはより良い」という誤った感覚があります)。
主な理由は、ループの変数を宣言できることです。
C99有効:
for (int i = 0; i < 100; i++)
{
doSomething();
}
C89、ANSI以上:
int i;
for (i = 0; i < 100; i++)
{
doSomething();
}
C99 GCCの実装 まだ完了していませんが、日常のプログラマーライフではかなり使用されています。私は前に参照を持っていませんが、GCCには、この実装が終了すると見なされる日にC99(または単にGNU99)に切り替えるという声明があります。
C99機能を使用するかどうかの問題は、実用的な部分に分けられます。
- どのプラットフォームのために私のコードをコンパイルする必要があります
- どのような機能を獲得しますか(私の好みのために、多くの清潔さとプログラムのポータブルを容易にします)
そして感情的 /イデオロギー的な部分。後では、恐竜の原則の適用以外の治療法はありません。