前処理命令-マクロ定義、条件コンパイル、ファイルの内容

3651 ワード

一.プリプロセッシングめいれい
1.C言語は、ソースプログラムをコンパイルする前に、いくつかの特殊な前処理命令(例えば、以前使用した#includeファイルに命令が含まれている)を解釈し、新しいソースプログラム(このプロセスをコンパイルプレと呼ぶ)を生成する.
処理)を行い、その後通常のコンパイルを行う(前処理命令はコードを0と1に翻訳する前に実行する)
2.前処理命令と一般的なC文を区別するために、すべての前処理命令は記号「#」で始まり、最後にセミコロンを使わない
3.前処理命令は、プログラムの任意の場所に表示され、その作用範囲は、その出現位置からファイルの最後までである.ソースプログラムの先頭にできるだけ前処理命令を書くことに慣れています.この場合、その動作は
使用範囲はソースファイル全体です
4.C言語で提供される前処理命令は主にマクロ定義、ファイル含む、条件コンパイルである.
二.マクロ定義
1.パラメータなしのマクロ定義
(1)一般形式:#defineマクロ名文字列(例:#define ABC 10)、右側の文字列も省略可能、例:#define ABC
(2)役割:前処理をコンパイルするときに、ソースプログラムのすべてのマクロ名を右側の文字列に置き換え、定数を定義するのによく使用されます.
(3)使用習慣と注意:
<1>マクロ名は大文字
<2>プログラムで二重引用符で囲まれた文字内の文字に対しては、マクロの置換操作は行われません.
<3>前処理をコンパイルしてマクロ名を文字列で置換する場合、構文チェックは行わず、単純な文字列置換にすぎない.マクロ名が置換されたソースプログラムの構文チェックは、コンパイル時にのみ行われます.
<4>マクロ名の有効範囲は、定義位置からファイル終了までであり、マクロ定義の役割ドメインを終了する必要がある場合は、#undefコマンド(役割ドメインカットオフ)を使用します.
<5>マクロを定義するときに定義したマクロ名を参照できます
2.パラメータ付きマクロ定義
(1)一般形式:#defineマクロ名(形パラメータリスト)文字列
(2)役割:前処理をコンパイルする際に、ソースプログラム内のすべてのマクロ名マクロ名(実パラメータリスト)を文字列にし、文字列内の形パラメータをマクロ名の右側の実パラメータリストのパラメータに置き換える.
#include 

#define average(a, b) ((a)+(b)/2)

int main ()
{
   int a = average(10, 4);  //      :int a = (10+4)/2

   printf("   :%d", a);
   return 0;
}

(3)使用上の注意:
<1>マクロ名とパラメータリストの間にスペースを付けることはできません.そうしないと、スペースの後ろにあるすべての文字列が置換された文字列として使用されます.
<2>パラメータ付きマクロは展開時に単純な文字とパラメータの置換のみを行い、計算操作は一切行わない.したがって、マクロを定義するときは、文字列のパラメータをカッコで囲み、計算結果もカッコで囲みます.a+bは((a)+(b))と書きます.
(4)関数との違い
使用プロセス全体から,パラメータ付きマクロ定義は,ソースプログラムに現れる形式が関数に似ていることが分かった.しかし、両者には本質的な違いがある:<1>マクロ定義は、記憶空間の割り当て、パラメータタイプマッチング、パラメータ伝達、戻り値問題<2>関数呼び出しがプログラム実行時に実行されず、マクロ置換はコンパイル前処理段階でのみ行われる.したがって、パラメータ付きマクロは関数よりも実行効率が高い.
二.じょうけんコンパイル
多くの場合、プログラムの一部のコードは、一定の条件を満たす場合にのみコンパイルされることを望んでいます.そうしないと、コンパイルに参加しません(コンパイルに参加したコードだけが最終的に実行されます).これが条件コンパイルです.
1.基本的な使い方
#if   1
    1
#elif   2
    2
#else
    3
#endif

(1)条件1が成立すると,コンパイラは#ifと#elifの間のコード1コードをコンパイルする(注意:コンパイルする,実行するのではなく,普段使っているif-elseとは異なる)
(2)条件1が成立せず,条件2が成立すると,コンパイラは#elifと#elseとの間のコード2コードをコンパイルする.
(3)条件1,2が成立しない場合,コンパイラは#elseと#endifの間のコード3をコンパイルする.
(4)条件コンパイル終了後、必ず一番後ろに#endifを付けなければなりません.そうしないと、結果は深刻です(endifはコンパイルに参加しない終了基準で、書かないと、後はすべて消えてしまい、コンパイルに参加しません).
(5)#ifおよび#elifの後の条件は、一般に変数ではなくマクロ定義を判断することである.条件コンパイルはコンパイル前に行われる判断であり、マクロ定義もコンパイル前に定義されるが、変数は実行時に発生し、使用する意味があるからである.
(6)例:
#define MAX 25

int main()
{
#if MAX == 0
      printf("MAX 0");
#elif MAX > 0
      printf("MAX  0");
#else
      printf("MAX  0");
#endif
      return 0;
}

2.その他の使い方
(1)#if define()とif!defined()の使い方
<1>#ifと#elifの後の条件は、マクロの値を判断するだけでなく、マクロが定義されているかどうかを判断するためにも使用できます.
#if defined( ) //           ,        
     
#endif

 <2>if !defined(マクロ)は、このマクロが定義されていない場合にコードを実行すると判断する.
(2)#ifdefとifndefの使用
<1>#ifdefの使用はif defined()の使用と一致し、括弧を書かない、括弧を書く
<2>#ifndefの使用とif!defined()の使い方は一致していますが、括弧を書かないで、括弧を書くだけです.
三.ファイルの内容
1.実は私たちはとっくに接触ファイルにこの命令を含んでいます.1つのファイルのすべての内容を別のファイルにコピーすることができます.
2.一般形式:
<1>第1の形式:#include(C言語ライブラリのファンクションヘッダファイルがあるディレクトリに直接ファイルを検索)
<2>2番目:#include“ファイル名”(システムはまずソースプログラムの現在のディレクトリの下で探し、見つからない場合はオペレーティングシステムのpathパスで探し、最後にC言語ライブラリの関数ヘッダファイルがあるディレクトリで探す)
3.使用上の注意
(1)#include命令は、a.hがb.hを含み、b.hがc.hを含むが、a.hがb.hを含み、b.hがa.hを含むなどの再帰的な含むことを許さない.
(2)includeコマンドを使用すると、同じヘッダファイルを複数回含むことになり、コンパイル効率が低下する可能性があります.解決策:
関数宣言をこのコードの真ん中に書きます.
 #ifndef _ファイル名_H_
 #define  _ファイル名_H_
関数宣言コード
 #endif