私はブロックを使用して、コンパイラに渡された#ifdef
ものに基づいてコードのブロックを条件付きで含めています。Dflag
でこれを実装する方法はありif
ますか?
次のようなもの:
if (defined(flag)) {
}
私はブロックを使用して、コンパイラに渡された#ifdef
ものに基づいてコードのブロックを条件付きで含めています。Dflag
でこれを実装する方法はありif
ますか?
次のようなもの:
if (defined(flag)) {
}
ゼロまたは非ゼロに評価されるようにマクロを定義すると、if
ステートメントの条件で使用できます。これはコンパイル時の定数であるため、ゼロの場合は、コンパイラのデッド コード エリミネーター パスが到達不能コードをとにかく削除します。
if
次のように、プリプロセッサを使用して別のフラグを生成し、実行時のステートメントでテストできます。
#ifdef flag
#define flag_defined 1
#else
#define flag_defined 0
#endif
今、あなたはこれを行うことができます:
if (flag_defined) ...
値をflag
定義するかどうかではなく、値 (0 または 1) を指定する場合は、次のようにします。
cc -Dflag=1 file.c
と
if (flag) { ... }
#ifdef
醜いsでコードを台無しにすることなく。また、定義をまったく忘れないように保護されています。flag
この場合、コンパイラはflag
識別子として扱います。宣言していないため、未宣言または未定義のシンボルに関するコンパイル時エラーが発生しますflag
。
いいえ、C の if ステートメントを使用して、プリプロセッサ トークンが定義されているかどうかを確認することはできません。ただし、これらのフォームのいずれかを使用できます
#ifdef flag
...
#endif
#if defined(flag)
...
#endif
ただし、トークンが真/偽の C 式に評価されるかどうかを確認できます。
使え-Dflag=1
ばできる
if (flag) {
...
}
オフにしたい場合は、マクロを次のように定義できます。-Dflag=0
これに続いて、C if ステートメントで確認できる新しいプリプロセッサ トークンを定義できます。例えば
#ifdef flag
#define FLAG_SET 1
#else
#define FLAG_SET 0
#endif
if(FLAG_SET) { //the flag macro was defined
...
}
フラグが定義されているかどうかを確認することだけが必要な場合は、これらすべてに意味はありません。単に を使用して#ifdef
ください。Cif
ステートメントを使用すると、ほとんどの C コンパイラがコードを最適化して取り除きます。プリプロセッサを使用しない利点を得るために実行時に変更できるものは何もありません。
#ifdef FLAG
#define FLAG_VALUE 1
#else
#define FLAG_VALUE 0
#endif
int flag = FLAG_VALUE;
...
if(flag)
{
....
}
または、必要に応じて-DFLAG_VALUE=1
orを使用して、直接使用します。-DFLAG_VALUE=0
FLAG_VALUE
実行時に FLAG_VALUE を変更できるようにする場合は、変数が必要になります。自明ではない方法 (デバッガーやその他のローダー トリックなど) で変更する場合は、必ず volatile を宣言してください。そうしないと、コンパイラーがデッド コードの削除を実行し、コードの巨大なチャンクを削除できる可能性があります。
flag
また、初期化後にの値を変更する予定がない場合は、おそらく にする必要がありconst
ます。