c言語プリプロセッサ

3078 ワード

本文は《C言語のプログラムの設計--現代の方法》から参考します
プリプロセッサは何ですか?
プリプロセッサは、コンパイル前にcプログラムを処理できる小さなソフトウェアで、他の言語とは異なり、cとc++言語はプリプロセッサに依存しており、現在ではコンパイラと統合されています.
プリプロセッサのメリットとデメリット
プリプロセッサは強力なプログラム処理ツールであるが、プリプロセッサはしばしば発見しにくいエラーを引き起こし、gccでは-Eオプションでコンパイル時にプリプロセッサの出力を生成することができる(他のコンパイラでも可能であり、方法が異なる).
プリプロセッシング命令
前処理は一般的にマクロ定義に分けられ、ファイルには、条件コンパイルの3つの一般的な命令が含まれています.
#define
マクロ定義は、一般的に定数を定義するために使用されます.たとえば、次のようにします.
タイプの名前変更#define BOOL int
文字列値#define CR"r"の定義
cの構文構造を変更します.例えば、define BRGIN{
                                              #define END }
パラメータ付きマクロ#define MAX(a,b)((x)>(y)?(x):(y))
#予算記号は、置換された文字にラベルを付けることができます.たとえば、
#define PRINT_INT(n) printf(#n "= %d", n)
に置き換えられます.
printf("i/j""=%d", i/j); 
c言語の隣接する文字列の面量がマージされ、
printf("i/j = %d", i/j);
##2つの識別子を組み合わせて、たとえば
#define MK_ID(n) i##n
int MK_ID(1), MK_ID(2),MK_ID(3);
/*        int i1, i2, i3;*/

使用例:比較サイズのマクロを定義したい場合、intとfloatタイプを比較することができます.同じマクロ名を2つ定義することはできません.typeで関数名を区別することができます.
#define GENERIC_MAX(type) type type##_max(type x, type y) \
			  {                               \
                              return x>y > x  : y;        \
                          }

マクロの有効範囲は、通常、マクロを含むファイルの末尾にあります.
マクロは#undef命令で定義を取り消すことができます.
長いマクロの定義
 #define ECHO(s) (gets(s), put(s)) 
 ECHO(str); /*   gets(str), puts(str)*/

c言語カスタマイズマクロ
c言語はいくつかのマクロをカスタマイズしました.例えば_FILE__コンパイルされたファイル名です.DATE__は、コンパイルされた日付であり、c 99には、__を含むいくつかのマクロが追加されている.stdC_VERSION__サポートされているcバージョンなど.
#include
ファイルには命令が含まれており、ヘッダファイルを含めるのによく使われます.
ヘッダファイルが2回含まれることを防止するには、次の条件に従ってコンパイルします.
#ifndef BOOLEAN.H
#define BOOLEAN.H
      
#endif

じょうけんコンパイル
     #if、#ifdef、#ifndef、#elif、#else、endif
定数式の値が0の場合、#ifと#endifの間のコードは前処理時に削除され、そうでない場合は保持されます.
       
#if      1
         0         
#elif    2
        1 0    2 0        
#else
	            
#endif

条件付きコンパイルを使用すると、マルチプラットフォームで移植可能なプログラムを記述できます.異なるコンパイラでコンパイルされたプログラムを記述できます.注釈を含むコードを一時的に遮断できます.
/*    */
#ifdef    
                     
#endif
/*         */
#if 0
        
#endif
/*             */
#if __STDC__
       
#else
          
#endif

前処理命令はすべて#で始まり、同じ命令の改行にはを付けます.例えば
#define DISK_CA      (SIDES * \
                       RADAS *)

命令はプログラムのどこにでも置くことができ、注釈と命令は習慣的に1行置くことができる.
その他のコマンド
#errorは通常、条件付きコンパイル命令とともに、通常のコンパイル中に発生すべきでない状況を検出するために使用されます.例えば、プログラムが100000を超えるマシンでコンパイルできないことを確認し、最大許容int値はINT_を使用します.MAXマクロ表示、
 
#if INT_MAX <100000
     #error int type is too small
endif

16ビットマシンでこのプログラムをコンパイルしようとすると、エラーが発生します:Error directive:int type is too small
#lineは変更可能_LINE__マクロの値、すなわち行番号を変更します.
#pragma命令はlibsライブラリなどを含むことができ、具体的な役割は複雑である.例えば:
#pragma comment(lib, "ws2_32.lib")//  winsock2