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 サイトの他の関連記事を参照してください。