C および C での未定義定数と #if 条件評価
プリプロセッサ ロジックでは、マクロと定数が重要な役割を果たすことがよくあります。 #if 条件で未定義の定数を処理するときに、一般的なシナリオの 1 つが発生します。ここでは、これらの未定義定数からの予測可能な動作に依存することが有効かどうかを検討します。
問題:
開発者は、未定義定数が次の値を取ると想定することがよくあります。 #if 評価で使用される場合は 0。この仮定は信頼できますか? それとも、未定義の定数による未定義の動作を期待すべきですか?
答え:
はい、この仮定は信頼できます。 C99 標準は、§6.10.1 ¶3 で次のように明確に指定しています。
マクロ展開と定義された単項演算子によるすべての置換が実行された後、残りのすべての識別子は pp 番号 0同様に、C 標準 (§16.1 ¶4) では次のように規定されています。マクロ展開と定義された単項演算子によるすべての置換が実行された後、true と false を除く、残りのすべての識別子とキーワードは次のようになります。 pp 番号 0 に置き換えられます。つまり、マクロ展開やその他の前処理ステップの後、#if 条件に現れる未定義の識別子または定数は自動的に値 0 に置き換えられます。この動作は、すべてのバージョンで一貫しています。 C および C .この予測可能な動作により、開発者は、未定義の結果やエラーが発生する危険を冒さずに、#if 条件で未定義の定数をフラグまたはプレースホルダーとして便利に使用できます。未定義の定数が前処理フェーズの前に定義されていない場合、コンパイラはデフォルトでそれを 0 として扱います。
以上がC および C の #if 条件で未定義の定数は 0 と評価されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。