C での変数宣言の配置

GCC では s の宣言が許可されているため、正常にコンパイルされます。 C89またはANSI標準の一部ではありませんが、GNU拡張として。これらの標準に厳密に準拠したい場合は、-pedantic に合格する必要があります。

c の宣言 { } の開始時 ブロックは C89 標準の一部です。ブロックは関数である必要はありません。


C89 では、スコープ ブロックの先頭ですべての変数を宣言する必要があります。 .

だから、あなたの char c 宣言は for ループ スコープ ブロックの先頭にあるため有効です。しかし、char *s 宣言はエラーになるはずです。


ブロックの先頭で変数宣言をグループ化することは、古い原始的な C コンパイラの制限によるものと思われます。最新の言語はすべて、ローカル変数の宣言を最新の時点、つまり最初に初期化する時点で行うことを推奨し、時には強制することさえあります。これにより、ランダムな値を誤って使用するリスクがなくなるためです。宣言と初期化を分離すると、「const」(または「final」) を使用できても使用できなくなります。

残念ながら、C++ は、C との下位互換性のために古い最上位の宣言方法を受け入れ続けています (1 つの C 互換性が他の多くのものか​​ら引きずり出されています...)。しかし、C++ はそれから離れようとしています:

  • C++ 参照の設計では、ブロックのグループ化のようなトップは許可されていません。
  • C++ ローカル オブジェクト の宣言と初期化を分離する場合 次に、追加のコンストラクターのコストを無料で支払います。引数のないコンストラクターが存在しない場合は、両方を分離することさえできません!

C99 は C を同じ方向に動かし始めます。

ローカル変数が宣言されている場所が見つからないと心配している場合は、より大きな問題があることを意味します:囲んでいるブロックが長すぎるため、分割する必要があります。

https://wiki.sei.cmu.edu/confluence/display/c/DCL19-C.+Minimize+the+scope+of+variables+and+functions