Cでの定義を見てきました
#define TRUE (1==1)
#define FALSE (!TRUE)
これは必要ですか?TRUE を 1 に、FALSE を 0 に単純に定義する利点は何ですか?
Cでの定義を見てきました
#define TRUE (1==1)
#define FALSE (!TRUE)
これは必要ですか?TRUE を 1 に、FALSE を 0 に単純に定義する利点は何ですか?
このアプローチは、コンパイラがサポートしている場合、実際のboolean
型を使用します (およびに解決されますtrue
) 。false
(具体的には C++)
__cplusplus
ただし、C++ が使用されているかどうかを (マクロ経由で) 確認し、実際に and を使用する方がよいでしょtrue
うfalse
。
0
C コンパイラでは、これはおよび と同等1
です。
(括弧を削除すると、操作の順序が原因で壊れることに注意してください)
#define TRUE (1==1)
#define FALSE (!TRUE)
と同等です
#define TRUE 1
#define FALSE 0
Cで。
関係演算子の結果は0
または1
です。1==1
は に評価されることが保証され1
、は に評価!(1==1)
されることが保証され0
ます。
最初の形式を使用する理由はまったくありません。ただし、ほとんどすべてのコンパイラで定数式が実行時ではなくコンパイル時に評価されるため、最初の形式の効率が劣るわけではないことに注意してください。これは、次の規則に従って許可されます。
(C99、6.6p2) 「定数式は、実行時ではなく変換中に評価できるため、定数が存在する可能性のあるあらゆる場所で使用できます。」
TRUE
リテラル forおよびFALSE
マクロを使用しない場合、PC-Lint はメッセージ (506、定数値ブール値) を発行します。
C の場合、
TRUE
は と定義する必要があります1
。ただし、他の言語では 1 以外の数量を使用するため、一部のプログラマー!0
は安全にプレイしていると感じています。
また、C99 では、stdbool.h
ブール値マクロの定義と リテラルtrue
を直接使用します。false
#define true 1
#define false 0
C++ (既に述べた) 以外に、静的解析ツールの利点があります。コンパイラは非効率性を排除しますが、静的アナライザーは独自の抽象型を使用して比較結果と他の整数型を区別できるため、TRUE が比較の結果である必要があり、互換性があると見なされるべきではないことを暗黙のうちに認識しています。整数で。
明らかに C は互換性があると言っていますが、バグを強調するためにその機能を意図的に使用することを禁止することを選択でき&
ます&&
。
実際の違いはありません。0
に評価されfalse
、1
に評価されtrue
ます。ブール式( 1 == 1
) またはを使用し1
て を定義true
しても、違いはありません。どちらも に評価されint
ます。
C 標準ライブラリには、ブール値を定義するための特定のヘッダーが用意されていることに注意してくださいstdbool.h
。