C/C++前処理指令

4671 ワード

本稿では主にC/C++前処理命令を記録し、一般的な前処理命令は以下の通りである.
#空のコマンド、何の効果もありません
#includeはソースファイルを含む
#define定義マクロ
#undef定義済みマクロのキャンセル
#if与えられた条件が真である場合、次のコードをコンパイルする
#ifdefマクロが定義されている場合は、次のコードをコンパイルします.
#ifndefマクロが定義されていない場合は、次のコードをコンパイルします.
#elif前の#ifで与えられた条件が真でなく、現在の条件が真である場合、次のコードをコンパイルします.
#endif終了#if......#else条件コンパイルブロック
#errorコンパイルを停止し、エラーメッセージを表示
前処理命令とは?
前処理命令は、#番号で始まるコード行です.#番号は、空白文字以外の行の最初の文字でなければなりません.#次はコマンドキーで、キーと#番号の間に任意の数の空白文字を許可します.行全体の文は、コンパイラがコンパイルされる前にソースコードをいくつか変換する前処理命令を構成します.
以前は気にしていなかった学者の注意によると、前処理命令はコンパイラがコンパイルする前に行う操作である.前処理プロセスはソースコードをスキャンし、初歩的な変換を行い、新しいソースコードをコンパイラに提供します.前処理プロセスがコンパイラより先にソースコードを処理していることがわかります.多くのプログラミング言語では、コンパイル時に他のソースファイルを含めたり、マクロを定義したり、条件に応じてコンパイル時にいくつかのコードを含むかどうかを決定したりする機能はありません(いくつかのファイルを繰り返し含むことを防止します).これらの作業を完了するには、前処理プログラムを使用する必要があります.現在、ほとんどのコンパイラには前処理プログラムが含まれていますが、コンパイラとは独立していると考えられています.前処理プロセスはソースコードを読み込み、前処理命令を含む文とマクロ定義をチェックし、ソースコードに応答する変換を行います.前処理プロセスでは、プログラム内のコメントと余分な空白文字も削除されます.
#includeはソースファイルを含む
この前処理命令は、最も多く見られるものだと思いますが、簡単に言えば、最初の方法はカッコでファイルを囲むことです.このフォーマットは、コンパイラが持参したヘッダファイルまたは外部ライブラリのヘッダファイルで、含まれるヘッダファイルを検索することを前処理プログラムに教える.2つ目の方法は、二重引用符でファイルを囲むことです.このフォーマットは、プリプロセッサが現在コンパイルされているアプリケーションのソースファイルに含まれるヘッダファイルを検索し、見つからない場合はコンパイラが持参したヘッダファイルを検索することを示す.2つの異なる組み込みフォーマットを採用する理由は、コンパイラが共通のサブディレクトリにインストールされ、コンパイルされたアプリケーションが独自のプライベートサブディレクトリの下にあるからです.1つのアプリケーションには、コンパイラが提供する共通のヘッダファイルと、カスタムのプライベートヘッダファイルが含まれます.2つの異なる組み込みフォーマットを使用すると、コンパイラは多くのヘッダファイルで共通のヘッダファイルのセットを区別することができます.
#define定義マクロ
#defineというマクロ定義については、#defineにはいくつかの不足があるため、C++はconstを使用して定数を定義することを強調するC言語で使用されることが多い.マクロは、特定のコンテンツを表す識別子を定義します.前処理では、ソースコードに表示されるマクロ識別子がマクロ定義時の値に置き換えられます.識別子の置換を行うだけであることを覚えておいてください.
以下に、defineの使用をいくつか挙げます.
  • 最大値と最小値を求めるマクロ
    #include 
    #define MAX(x,y) (((x)>(y))?(x):(y))
    #define MIN(x,y) (((x)
  • をdefineで実現する.
  • マクロ定義エラー
  • #include 
    #define SQR(x) (x*x)
    int main(void)
    {
        int b=3;
    #ifdef SQR//         ,     ,        
        printf("a = %d
    ",SQR(b+2)); #endif return 0; } /* * , 。 B+2 * , :b+2*b+2 * :#define SQR(x) ((x)*(x)) * , , 。 */
  • マクロパラメータの接続
  • #include 
    #define STR(s) #s
    #define CONS(a,b) (int)(a##e##b)
    int main(void)
    {
    #ifdef STR
        printf(STR(VCK));
    #endif
    #ifdef CONS
        printf("
    %d
    ",CONS(2,3)); #endif return 0; } /* ( , , ) * , # * , ## 2 , aeb,2e3 2000 */
  • マクロで1ワードの上位または下位のバイト
  • を得る.
    #include 
    #define WORD_LO(xxx) ((byte)((word)(xxx) & 255))
    #define WORD_HI(xxx) ((byte)((word)(xxx) >> 8))
    int main(void)
    {
        return 0;
    }
    
    /*
     *    2   ,     ( 8 ), 255(0000,0000,1111,1111)    
     *      ( 8 ),  8   。
    */
    
  • マクロ定義により1つの配列に含む要素の個数
  • を得る.
    #include 
    #define ARR_SIZE(a) (sizeof((a))/sizeof((a[0])))
    int main(void)
    {
        int array[100];
    #ifdef ARR_SIZE
        printf("array has %d items.
    ",ARR_SIZE(array)); #endif return 0; } /* * */

    #defineマクロの使用については、特にパラメータ計算を含む場合は小2例のように、最も安全な方法でパラメータを括弧で囲むことに注意してください.
    #ifdef,#ifndef,#endif...の使用
    以上のプリコンパイル命令は,いずれも条件コンパイル命令であり,すなわち,それらのコードがコンパイルされ,コンパイルされないものを決定する.
  • 例1:
    #include 
    #include 
    #define DEBUG
    int main(void)
    {
        int i = 0;
        char c;
        while(1)
        {
            i++;
            c = getchar();
            if('
    ' != c) { getchar(); } if('q' == c || 'Q' == c) { #ifdef DEBUG// DEBUG printf("We get:%c,about to exit.
    ",c); #endif break; } else { printf("i = %d",i); #ifdef DEBUG printf(",we get:%c",c); #endif printf("
    "); } } printf("Hello World!
    "); return 0; } /*#endif #if 。*/
  • ifdefおよび#ifndef
  • #include 
    #define DEBUG
    main()
    {
    #ifdef DEBUG
        printf("yes ");
    #endif
    #ifndef DEBUG
        printf("no ");
    #endif
    }
    //#ifdefined   #ifdef;
    //#if!defined   #ifndef
    
  • その他の命令
  • #error               ,      。
    
    #line                           。
    
    #pragma         。           。                    。
    

    まとめ:
    前処理は,コンパイルの第1回文法スキャンと文法解析を行う前に行う作業である.はっきり言って、ソースファイルをコンパイルする前に、前処理部分を処理してから、処理後のコードをコンパイルします.このような利点は,処理後のコードが短くなることである.