1

私はブロックを使用して、コンパイラに渡された#ifdefものに基づいてコードのブロックを条件付きで含めています。Dflag

でこれを実装する方法はありifますか?

次のようなもの:

if (defined(flag)) {

}
4

5 に答える 5

5

ゼロまたは非ゼロに評価されるようにマクロを定義すると、ifステートメントの条件で使用できます。これはコンパイル時の定数であるため、ゼロの場合は、コンパイラのデッド コード エリミネーター パスが到達不能コードをとにかく削除します。

于 2013-05-30T19:11:14.780 に答える
5

if次のように、プリプロセッサを使用して別のフラグを生成し、実行時のステートメントでテストできます。

#ifdef flag
#define flag_defined 1
#else
#define flag_defined 0
#endif

今、あなたはこれを行うことができます:

if (flag_defined) ...
于 2013-05-30T19:11:27.383 に答える
3

値をflag定義するかどうかではなく、値 (0 または 1) を指定する場合は、次のようにします。

cc -Dflag=1 file.c

if (flag) { ... }

#ifdef醜いsでコードを台無しにすることなく。また、定義をまったく忘れないように保護されています。flagこの場合、コンパイラはflag識別子として扱います。宣言していないため、未宣言または未定義のシンボルに関するコンパイル時エラーが発生しますflag

于 2013-05-30T19:13:26.830 に答える
1

いいえ、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 コンパイラがコードを最適化して取り除きます。プリプロセッサを使用しない利点を得るために実行時に変更できるものは何もありません。

于 2013-05-30T19:12:47.170 に答える
1
#ifdef FLAG
#define FLAG_VALUE 1
#else
#define FLAG_VALUE 0
#endif

int flag = FLAG_VALUE;

...

if(flag)
{
    ....
}

または、必要に応じて-DFLAG_VALUE=1orを使用して、直接使用します。-DFLAG_VALUE=0FLAG_VALUE

実行時に FLAG_VALUE を変更できるようにする場合は、変数が必要になります。自明ではない方法 (デバッガーやその他のローダー トリックなど) で変更する場合は、必ず volatile を宣言してください。そうしないと、コンパイラーがデッド コードの削除を実行し、コードの巨大なチャンクを削除できる可能性があります。

flagまた、初期化後にの値を変更する予定がない場合は、おそらく にする必要がありconstます。

于 2013-05-30T19:14:03.560 に答える