最近、非常に古いバージョンのGCC(バージョン2.3のまわり)でコンパイルされたレガシーコードを修正しなければなりませんでした。関数内では、使用する前に変数を宣言しなければなりませんでした。私はこれがC89の標準であると信じています。この制限は後で削除されます。古いCで使用する前に変数を宣言する
私の質問は次のとおりです。当時、彼らはなぜこの判決を強制したのですか?ソフトウェアの完全性を危うくする懸念はありましたか?
最近、非常に古いバージョンのGCC(バージョン2.3のまわり)でコンパイルされたレガシーコードを修正しなければなりませんでした。関数内では、使用する前に変数を宣言しなければなりませんでした。私はこれがC89の標準であると信じています。この制限は後で削除されます。古いCで使用する前に変数を宣言する
私の質問は次のとおりです。当時、彼らはなぜこの判決を強制したのですか?ソフトウェアの完全性を危うくする懸念はありましたか?
変数はまだ使用される前に宣言されなければならず、関数の先頭で宣言する必要はありませんでした。
C89の要件は、ブロックが1つ以上の宣言の後に0または複数の宣言が続き、その後には}
が続くオープニング{
で構成されていることです。
、これは法律上のC89である(そして、void
せず、1978年に起こっても、K & RC、またはそれ以前):
int foo(void) {
int outer = 10;
{
int inner = 20;
printf("outer = %d, inner = %d\n", outer, inner);
}
printf("outer = %d, inner is not visible\n", outer);
return 0;
}
C99は、宣言と文は内で混合することができるように、これを緩めブロック:B、BCPL、とさえアルゴル:オリジナルの制限の理由については
int foo(void) {
int x = 10;
printf("x = %d\n", x);
int y = 20;
printf("y = %d\n", y);
return 0;
}
、私はそれが戻ってCの祖先の言語に行くと思います。おそらくコンパイラの仕事は少し楽になりました。 (私は構文解析が簡単になると思っていましたが、そうは思いませんが、何かが宣言であるか文であるかを文脈から事前に知らなくても区別できなければなりません)
はい、私は「トップで宣言」スタイルを好んでいます。 –
@AmigableClarkKant:特に、イニシャライザの前のステートメントを利用できるようにするために、変数を宣言するためには何かがあります。 –
「イニシャライザで前のステートメントを利用することができる」とは分かりません。 –
主にコンパイラを書きやすくしました。すべての宣言が関数の先頭にある場合、コンパイラはすべてのローカルを解析して必要なスタックの量を決定するのは簡単です。
もちろん、コンパイラは30年前よりもはるかに成熟しています。したがって、プログラマにとっては迷惑になるので、この制限を取り除くことは理にかなっています。
しかし、関数の始めにすべての変数を宣言すると、コードがより洗練され、読みやすく、管理しやすくなると思います。しかし、私は認めています。時には、そういう形でコードを書くのはちょっと面倒なこともあります。 – Radu
最初の非宣言文の前に、常に新しいコードをコードのブロックの先頭に挿入することができました。したがって、void function(int i){int j; {int k; ...; } ...; } 'は常に有効でした(楕円の代わりに適切なコードを使用してください)。 –
変数を宣言する理由を尋ねるあるいは、関数の始めに変数が宣言されているのはなぜですか?あなたの質問を表現する方法は非常に奇妙です。 –