Cプリコンパイル処理

6959 ワード

C言語プリコンパイル処理は3つの側面を含み、マクロ定義、および条件コンパイル、ファイルは
1.マクロ定義
解析:指定したフラグで文字列を表す
#define PI 3.141592653

パラメータなしマクロ定義
  • 無パラメータ
  • 一般大文字
  • は、統一置換(数値を直接修正し、すべての箇所を修正する)
  • を得る.
  • 末尾にセミコロンを付けることはできません(#define PI 3.141592653;プログラム中のfloat area=PI*3*3;マクロ展開の結果:float area=3.141592653;*3*3、コンパイルエラー)
  • は、階層的に置換することができる(マクロは、以前に定義されたマクロを使用することができる)
  • .
  • ""号内は変換されません(printf(「PI is a float numer:」);文中のPIは引用符「」でマクロ展開を行わない)
  • は文字置換のみであり、空間(変数に対する)
  • は割り当てられない.
    パラメータ付きマクロ定義
    #define ADD(a, b) a+b
  • パラメータ文字を統一置換
  • マクロ名とカッコにスペースを付けることはできません
  • 統一置換エラーに注意してください.例えば、#define AREA(r)3.14*r*r/2は円の面積を得ることを意味し、AREA(a+b)マクロ展開結果:3.14*a+b*a+b/2は、予想と一致しないため、rに括弧#define AREA(r)3.14*(r)/
  • を付けなければなりません.
    #と##
    マクロ定義では、#は2つの文字列を結合していることを示し、マクロの両側に引用符を付けるように理解できます.
    #include <stdio.h>
    
    #define PRINT(w,h) printf("Your input is " #w #h "
    "); int main(int argc, char* args[]) { PRINT(3,4);return 0; }

    出力結果:
    Your input is 34
    #番号パラメータ付きマクロを展開すると、次の結果が得られます.
    printf("Your input is ""3""4""");
     
    ##このパラメータが変数の一部であることを示す
    #include <stdio.h>
    
    #define PRINT(w,h) printf("Your input is" #w #h "df
    "); #define VAR_PRE(name) var_##name int main(int argc, char* args[]) { PRINT(3,4); int VAR_PRE(count) = 5; printf("%d
    ", VAR_PRE(count)); return 0; }

    ##nameパラメータとvar_結合はcount変数に接頭辞を返すことに相当し、異なるカテゴリを区別する.
    可変パラメータ...
    C++マクロ定義における可変パラメータ表現は…であり、マクロ定義でこのパラメータにアクセスする方法は_VA_ARGS__
    #include <stdio.h>
    
    #define PRINT_ALL(...) printf(#__VA_ARGS__ "
    ") int main(int argc, char* args[]) { PRINT_ALL(A, B, C); return 0; }

    出力結果:A,B,C
    特定のパラメータに個別にアクセスします(このメソッドは一時的に表示されません).
    2.条件コンパイル
    条件コンパイルはコンパイラに伝えます.一部のコードはコンパイルしなくても、繰り返しコンパイルを避けるためによく使用されます.
    // common.h
    
    
    
      #ifndef COMMON_H
    
    
    
      #define COMMON_H
    
    
    
      class Circle {
    
    
    
      public:
    
        string r;
    
      };
    
    
    
      #endif

    シーンはcommonを含む複数の場所である.hファイル、#ifndefコンパイラ対commonを避ける.h複数回コンパイル
    3.ファイルの内容
      #include
  • は一度に1つのファイル
  • しか導入できません.
  • と「common.h」の違いは<>標準ライブラリのみで検索する、common.h標準ライブラリでの検索に加えて、ユーザが指定するPATHパスでの検索コンパイル
  • も行う.
     
    4.マクロ定義の2人のユーザー
    //1,            
    
    #ifndef COMDEF_H
    
    #define COMDEF_H
    
    //     
    
    #endif
    
    //2,        ,               ,           ,    。
    
    typedef unsigned char boolean; /* Boolean value type. */
    
    typedef unsigned long int uint32; /* Unsigned 32 bit value */
    
    typedef unsigned short uint16; /* Unsigned 16 bit value */
    
    typedef unsigned char uint8; /* Unsigned 8 bit value */
    
    typedef signed long int int32; /* Signed 32 bit value */
    
    typedef signed short int16; /* Signed 16 bit value */
    
    typedef signed char int8; /* Signed 8 bit value */

     
    参考資料:
    http://www.360doc.com/content/08/0324/11/59579_1140684.shtml
    http://www.360doc.com/content/09/1009/16/59579_7027058.shtml