if
ステートメント#if
と and#ifdef
ステートメントを使用するのはスタイルの問題なのか、それとも機能に違いがあるのか、なぜ他のステートメントよりも 1 つを使用するのか疑問に思っていました。
#ifdef
これは、ステートメントの正しい使用方法ですか?
#define variable 1
#ifdef variable //if variable is defined as 1?
//code
#endif
if
ステートメント#if
と and#ifdef
ステートメントを使用するのはスタイルの問題なのか、それとも機能に違いがあるのか、なぜ他のステートメントよりも 1 つを使用するのか疑問に思っていました。
#ifdef
これは、ステートメントの正しい使用方法ですか?
#define variable 1
#ifdef variable //if variable is defined as 1?
//code
#endif
#if
プリプロセッサによって使用され、条件付きでコンパイル用のコードのセクションを含めるために使用されます。典型的な使用法は、ソース ファイルを異なるオペレーティング システム (または異なるコンパイラ) 用にコンパイルする必要がある場合です。
#ifdef _WIN32
/* Something specific to windows. */
#else
/* Something not available on windows. */
#endif
if
ステートメントは、実行時にプログラムの流れを制御するために使用されます。
2つのステートメントは、コンパイラーの2つの異なるステージによって実行されます。
#ifdef ...
プリプロセッサによって実行されます。コードの保護された部分を削除するか、そのまま残します。これはコンパイル時に行われるため、条件はコンパイル時定数である必要があります。コードの一部がによって除外されている#ifdef
場合、対応するコードはコンパイルされた実行可能ファイルには含まれません。
if (...)
コンパイラによって処理され、実行可能コードに変換されます。その式は実行時に計算できます。式の両側は、コンパイルされた実行可能ファイル*に残ります。
*オプティマイザが1つのパーツを削除できることを検出しない限り。これは一般的ではありません。
プレフィックスが付けられたすべてのディレクティブは、コンパイルの前に実行される、プリプロセッサと呼ばれる#
コンパイラの一部によって処理されます。つまり、あなたの例のコードの場合、が定義されていない場合、と の間のコードはコンパイラによってさえ見えません。variable
#ifdef
#endif
この区別には重要な理由があります。
コード 1 -
#if SOMETHING
do_some_c_stuff();
#endif
コード 2 -
#ifdef SOMETHING
do_some_c_stuff();
#endif
そのため、次のように頻繁に表示されます。
#ifdef SOMETHING
#if SOMETHING
do_some_c_stuff();
#endif
#endif
またはそれらの組み合わせ
#ifdef
はコンパイラによって前処理されます。これは、式が実行時に評価されないことを意味します。これは通常、コンパイルフラグをチェックするために使用されます。
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です。
私たちが扱うすべての行#
は、コンパイラ(gcc)によって処理されます。バイナリでは扱われません(ランタイム)
これは、#ifdefステートメントを使用する正しい方法ですか?->はい
#if
コンパイル時に#ifdef
評価され、プリプロセッサ命令です。コードで「変数」という名前を付けた項目は変数ではありませんが、コードがコンパイルされる前に、コード内で出現するすべての「変数」を1に置き換える数値定数です。このようなプリプロセッサ命令はすべて、コードをバイナリに変換する方法をコンパイラに示すだけです。
通常のifステートメントはまったく異なるものであり、実際のプログラム自体の一部であり、ランタイムチェックを実行して、プログラムの「フロー」を制御します。