前処理コマンド——条件コンパイル


ifdefインジケータを柔軟に使用すると、特定のヘッダファイル、ライブラリ、その他のファイルバージョンに関連するコードを区別することができます.スイッチに相当し、defineで定義し、存在する場合はifdef endifブロックの内容を実行します.

#include "iostream.h"
int main()
{
#ifdef DEBUG      
cout<< "Beginning execution of main()";//                
#endif      
return 0;
}

実行結果:Press any key to continue
書き換えコードは次のとおりです.

#include "iostream.h"
#define DEBUG
int main()
{
#ifdef DEBUG      
cout<< "Beginning execution of main()";
#endif       
return 0;
}

実行結果:Beginning execution of main()
                  Press any key to continue
より一般的には、#define文は特定のヘッダファイルに含まれています.
例えば、新しいヘッダファイルhead.h、ファイルにコードを追加する:
#ifndef DEBUG
#define DEBUG
#endif
コードは次のように変更されます.

#include "iostream.h"
#include "head.h" 
int main(){
#ifdef DEBUG      
cout<< "Beginning execution of main()";
#endif       
return 0;
}

実行結果は次のとおりです:Beginning execution of main()
                    Press any key to continue
結論:ifdefインジケータを使用することで、特定のヘッダファイル、ライブラリ、その他のファイルバージョンに関連するコードを区別できます.
前処理は,コンパイルの第1回文法スキャンと文法解析を行う前に行う作業である.ソースファイルをコンパイルする前に、前処理部分を処理し、処理後のコードをコンパイルします.このような利点は,処理後のコードが短くなることである.
何事も#で始まるcodeはすべて前処理コマンドで、defineはマクロ定義コマンドです
#define識別子文字列eg:
#define CM_COMMAND_NOTE 0x000U
プログラムでCM_に遭遇COMMAND_NOTEの場所はすべて0 x 000 Uに取って代わります
条件コンパイルのいくつかの状況:
ケース1:
#ifdef _XXX
...セグメント1...
#else
...セグメント2...
#endif
これは、識別子XXXがdefineコマンドによって定義されている場合、プログラムセグメント1がコンパイルされることを示す.そうでなければ、セグメント2をコンパイルします.
ケース2:
#ifndef _XXXX
...セグメント1...
#else
...セグメント2...
#endif
識別子XXXXが定義されていない場合、プログラムセグメント1が実行され、そうでない場合、プログラムセグメント2が実行される.
ケース3:
#if定数
...セグメント1...
#else
...セグメント2...
#endif
ここでは、定数が真(0以外の場合、任意の数字で、0でない限り)であれば、プログラムセグメント1を実行し、そうでなければプログラムセグメント2を実行することを示す.
この方法はテストコードを追加することができる.テストを開く必要がある場合は、定数を1にし、テストしない場合は、定数を0にします.
ケース4:
ヘッダファイルの#ifndef-->
2つのCファイルがある場合、この2つのCファイルは同じヘッダファイルをincludeします.コンパイル時、この2つのCファイルは一緒に実行可能なファイルにコンパイルされ、問題が発生し、大量の宣言が衝突した.これにより、ヘッダーファイルの内容をifndefとendifに配置することが望ましい.ヘッダファイルが複数のファイルに参照されるかどうかにかかわらず、これを追加します.
一般的なフォーマットは次のとおりです.
#ifndef<識別>
#define
......
......
#endif
<識別子>は理論的には自由に命名できるが、各ヘッダファイルのこの「識別子」は一意であるべきである.標識の命名規則は一般的にヘッダファイル名が大文字で、前後に下線を引き、ファイル名の「.」下線にもなります.例えば、stdio.h
#ifndef _stdIO_H_
#define _stdIO_H_
......
#endif
ケース5:
変数に発生する問題をifndefで定義します(一般的にはifndefでは定義されません).
#ifndef AAA
#define AAA
...
int i;
...
#endif
変数定義があります
vcにリンクするとiが定義を繰り返すエラーが発生し、cでコンパイルに成功します.
結論:
(1).最初にこの頭を使ったときcppファイル生成.objの場合、int iは、これを別のものとして使用することを定義する.cppは再び[単独]生成する.objの場合、int iはまた定義され、2つのobjは別のものとなる.cppもincludeというヘッダを接続すると、繰り返し定義が現れる.
(2).ソースファイルの拡張子を変更する.c後,VCはC++ではなくC言語の構文に従ってソースプログラムをコンパイルする.C言語では,複数のint iに遭遇すると,そのうちの1つが定義であり,他は宣言であると自動的に認識される.
(3).C言語とC++言語の接続結果は異なり、コンパイル時にC++言語がグローバルになる可能性がある
変数のデフォルトは強い記号なので、接続エラーが発生しました.C言語は初期化するか否かによって強弱の判断を行う.(参考)
解決方法:
(1).ソースファイルの拡張子を変更する.c.
(2).推奨ソリューション:
.hではextern int iのみを宣言する.はい.cppで定義

#ifndef __X_H__
#define __X_H__
extern int i;
#endif//__X_H__

int i;
注意:
変数は一般的に定義しない.hファイルにあります.
転入先
http://hi.baidu.com/taney/blog/item/1a06abee1763d92a2df534b7.html