通常、警告は、コードが意図したとおりに動作しない可能性が高いが、その言語では合法であることを意味します。コンパイラは、「これはおそらくあなたが本当にやりたかったことではありませんが、言語が許可していると言っているので、許可しなければなりません」と言っています。C標準で許可されているため、コンパイラはこのコードのエラーを表示できません。したがって、許可する必要があります(GCCの-Werrorオプションを使用して警告をエラーに変えるなど、そのようなエラーを具体的に要求しない限り)。
C 標準は、プログラムで意味のあるすべてを定義しようとはしません。たとえば、次のことは C では合法です。
3;
if (x) then foo(); else foo();
x = 4*0;
最初のステートメントには副作用がなく、その戻り値は使用されません。ただし、ステートメントは単なる式である可能性があるため、C では合法です。2 番目のステートメントは を呼び出すだけなfoo()
ので、if
は無意味です。3 番目のステートメントでは、4 を掛けても意味がありません。
意味のないものをすべて禁止する C 標準を作成するのは非常に困難です。そして、それは確かに努力する価値はありません。これはあなたの回答の一部です: C 標準を作成する委員会が言語を構築するとき、彼らは意味をなさないものを除外するために技術仕様を書き直すことに多くの時間を費やしたいですか? 重大なバグを引き起こす可能性のあるものを避けることが価値があると思われる場合は、そうです。しかし、多くの場合、時間の価値がなく、仕様が不必要に複雑になります。
ただし、コンパイラはこれらのいくつかを認識して警告することができます。これにより、多くのタイプミスやその他の間違いを見つけることができます。
一方、これらの構造は、異常な状況から生じることがあります。たとえば、プログラムにはstruct A
、さまざまなターゲットやさまざまな機能をビルドするときにさまざまな方法で定義するプリプロセッサ ステートメントが含まれている場合があります。これらのターゲットの一部では、 でstruct B
メンバーが必要ないため宣言されていない可能性がありますが、プリプロセッサ ステートメントをそのように記述する方が簡単だったという理由だけで、(オブジェクトではなく型)struct A
の宣言は存在したままです。struct B
したがって、コンパイラーは、さまざまなプログラムを作成するプログラマーの邪魔にならないように、これらのことを許可する必要があります。