0

ifステートメント#ifと and#ifdefステートメントを使用するのはスタイルの問題なのか、それとも機能に違いがあるのか​​、なぜ他のステートメントよりも 1 つを使用するのか疑問に思っていました。

#ifdefこれは、ステートメントの正しい使用方法ですか?

#define variable 1

#ifdef variable      //if variable is defined as 1?
//code
#endif
4

8 に答える 8

2

#ifプリプロセッサによって使用され、条件付きでコンパイル用のコードのセクションを含めるために使用されます。典型的な使用法は、ソース ファイルを異なるオペレーティング システム (または異なるコンパイラ) 用にコンパイルする必要がある場合です。

#ifdef _WIN32
/* Something specific to windows. */
#else
/* Something not available on windows. */
#endif

ifステートメントは、実行時にプログラムの流れを制御するために使用されます。

于 2012-09-25T15:33:18.210 に答える
1

2つのステートメントは、コンパイラーの2つの異なるステージによって実行されます。

#ifdef ...

プリプロセッサによって実行されます。コードの保護された部分を削除するか、そのまま残します。これはコンパイル時に行われるため、条件はコンパイル時定数である必要があります。コードの一部がによって除外されている#ifdef場合、対応するコードはコンパイルされた実行可能ファイルには含まれません。

if (...)

コンパイラによって処理され、実行可能コードに変換されます。その式は実行時に計算できます。式の両側は、コンパイルされた実行可能ファイル*に残ります。


*オプティマイザが1つのパーツを削除できることを検出しない限り。これは一般的ではありません。

于 2012-09-25T15:34:02.940 に答える
1

プレフィックスが付けられたすべてのディレクティブは、コンパイルの前に実行される、プリプロセッサと呼ばれる#コンパイラの一部によって処理されます。つまり、あなたの例のコードの場合、が定義されていない場合、と の間のコードはコンパイラによってさえ見えません。variable#ifdef#endif

于 2012-09-25T15:32:58.240 に答える
1

この区別には重要な理由があります。

コード 1 -

#if SOMETHING
    do_some_c_stuff();
#endif
  1. 「SOMETHING」が true の場合、do_stuff 関数を呼び出します
  2. "SOMETHING" が false の場合、このコードはコンパイルされません。
  3. コードベースで「SOMETHING」が定義されていない場合は、コンパイルしないでください。

コード 2 -

#ifdef SOMETHING
    do_some_c_stuff();
#endif
  1. 「SOMETHING」が定義されている場合 (true または false)、do_some 関数を呼び出します。
  2. コードベースで「SOMETHING」が定義されていない場合、このコードはコンパイルされません

そのため、次のように頻繁に表示されます。

#ifdef SOMETHING
#if SOMETHING
    do_some_c_stuff();
#endif
#endif

またはそれらの組み合わせ

于 2012-09-25T15:48:19.823 に答える
0

#ifdefはコンパイラによって前処理されます。これは、式が実行時に評価されないことを意味します。これは通常、コンパイルフラグをチェックするために使用されます。

于 2012-09-25T15:33:55.703 に答える
0

http://msdn.microsoft.com/en-us/library/4y6tbswk(v=vs.100).aspx

Cliffs:#ifコンパイル時に評価し、その結果に基づいて、#if...内のコードブロック内のコードを実行します#endif。一般的な使用:

#if DEBUG
    // Do some additional logging here we don't want to to in release.
#endif

すでに述べたように、ローカル変数にはアクセスできません。プリプロセッサディレクティブは、定義したものにアクセスします。Visual StudioのデフォルトでDEBUGは、モードがに設定されている場合に定義されますDebug。その#ifDEBUG`コードを上からプロジェクトに追加すると、リリースモードに切り替えると、その中のコードが少し「グレー表示」になります(すべてのデフォルト設定を想定)。これは、コンパイル時にグレー表示されたコードが現在の構成で実行されないことを示すVisualStudioです。

于 2012-09-25T15:34:12.713 に答える
0

私たちが扱うすべての行#は、コンパイラ(gcc)によって処理されます。バイナリでは扱われません(ランタイム)

これは、#ifdefステートメントを使用する正しい方法ですか?->はい

于 2012-09-25T15:35:11.307 に答える
0

#ifコンパイル時に#ifdef評価され、プリプロセッサ命令です。コードで「変数」という名前を付けた項目は変数ではありませんが、コードがコンパイルされる前に、コード内で出現するすべての「変数」を1に置き換える数値定数です。このようなプリプロセッサ命令はすべて、コードをバイナリに変換する方法をコンパイラに示すだけです。

通常のifステートメントはまったく異なるものであり、実際のプログラム自体の一部であり、ランタイムチェックを実行して、プログラムの「フロー」を制御します。

于 2012-09-25T15:37:02.933 に答える