C 標準では、「診断」という用語のみが使用されます。警告とエラーの区別はありません。
const int *
キャストなしのへの変換はint *
、診断が必要な制約違反です。
これは、構文エラーと同じカテゴリに分類されます。コードは有効な ISO C プログラムではなく、とにかく変換して実行した場合の動作は未定義です。
残念ながら、多くのコンパイラは、必要な診断と、追加する追加の診断を区別していません。さらに悪いことに、警告として診断を要求することもありました。これは許可されています。C 標準では、診断を必要とするプログラムは変換および実行を禁止する必要があるとは規定されていません。警告を発行することにより、コンパイラは診断の要件を満たします。
もう 1 つの問題は、多くの C コンパイラが要求されない限り標準の ISO C 方言を受け入れず、代わりに独自の方言を受け入れることです。
GNU C コンパイラは、方言オプションを指定しない場合、GNU C 89 と呼ばれる C 方言を理解します。
const int *
したがって、皮肉なことに、この方言では、キャストなしに変換することは単なる警告にすぎint *
ませんが、特定の合法的な C90 プログラムは完全に拒否されます。
したがって、基本的には、コンパイラの入力方言を制御する方法を常に理解し、すべての警告をフォローアップする必要があります。これらの警告は、言語の実際の違反であるか、コンパイラの気まぐれであるかにかかわらず、自分で理解する必要があります。作家 (「この表現を括弧で囲むことを提案する」)。
gcc -Wall -W -ansi
(C90 でプログラミングしている場合、またはC99-std=c99
の代わりにansi
) を使用してコンパイルし、警告がないことを確認することは悪い考えではありません。余分な括弧などを示唆する文体的なものでさえありません。警告をフォローアップするのに十分な訓練を受けていない場合は、警告を-Werror
ビルドに失敗するエラーに変えるために追加してください。をお勧めする人も-pedantic
います。
この規則に従えば、a の転覆がconst int
コードベースに忍び込むことはありません。