C言語のマクロ、条件付きコンパイル

仕上げの注意事項:

パラメータを使用してC言語のマクロ定義

 

マクロ定義

マクロの一般的な形態は次のように定義される:
の#defineマクロ名文字列または式
前処理は交換することである、マクロ名は、対応する文字列表現に置き換えられます。

マクロ定義文字列:

#defineマクロ名の文字列

この例ではステートメントINT合計= 20 + N ;, Nは100で置き換えました

する#include <stdio.hに>
 の#define N 100
 INT のmain(){
     int型の合計= 20 + N。
    printf(" %dの\ n " 、合計)。
    リターン 0 ; 
}

マクロ定義式:

#define   マクロ名(式)
する#include <stdio.hの>
 に#define M(N * N + 3×N)
 INT のmain(){
     int型和、N。
    printf(" 入力A番号:" ); 
    scanf関数(" %のD "、&N)
    合計 = 3 * M + 4 * M + 5 * M。
    printf(" 和=%D \ n " 、合計)。
    リターン 0 ; 
}

注:マクロ定義は、括弧内の式でなければなりません

マクロ定義のためのいくつかの説明

1)マクロ定義マクロ名を示す文字列であり、マクロ置換マクロ名文字列の時間と膨張、これは単純な、粗置換です。間違った、唯一のマクロ展開をコンパイルされたソースプログラムで見つかった場合などのステートメント、関数は、それは、任意のプリプロセッサチェックを行わなかった場合、文字列は、任意の文字を含めることができ、それは、定数式を指定できます。

2)そのようなセミコロンのように、記載されていないか、マクロ定義文、行の末尾にセミコロンがありませんであっても、セミコロンで置き換えること。

マクロ定義は、関数外に記述されなければならない3)、その範囲は、マクロコマンドで定義されたソース端を果たしています。scopeコマンド#undefの使用を終了するには。例えば:
それは主に、無効FUNC()で効率的にのみPI()関数を表します。

#define PI 3.14159
 INT メイン(){
     // コード
    リターン 0 
} 
#undefの PI
 ボイドFUNC(){
     // コード 
}

コードは引用符マクロ名で囲まれている場合4)、マクロプリプロセッサではなく、それになされていません。

5)ネストされたマクロ定義は、マクロ名は、マクロプリプロセッサの層で置換することによって拡張マクロ定義で定義された文字列で使用することができる可能にします。例えば:

#define PI 3.1415926
 の#define S * Y Y * PI / PI *マクロ名* /定義されている
ステートメントの:
のprintf(" %F " 、S); 
マクロ置換なった後:
のprintf(" %F "3.1415926 * Y * Y);

大文字で6)慣用マクロ名、変数にそう差。しかし、また、小文字を可能にします。

7)データを簡単に書いて、使用可能なマクロのタイプを示します。例えば:

#define UINT unsigned int型

変数宣言としてプログラムで利用可能なUINT:

UINTのA、B;

これは、ことに留意されたいタイプの定義データやマクロ定義を使用してのtypedef指定子を使用して差を示すデータ。文字列マクロ定義は、単にプロセスにプリプロセッサで置き換える;およびtypedefでは、コンパイラによってコンパイル時に処理され、それは新しい名前を開始する元に、単純な文字列の置換、およびデータ・タイプではありません、新しいデータ型としてそれ。


パラメータを持つマクロ定義


C言語では、引数付きマクロを可能にします。マクロ定義のパラメータは、「仮パラメータ」と呼ばれているではマクロ呼び出しのパラメータは、「実パラメータ」と呼ばれ、これはやや類似した機能です。

だけでなく、展開時のマクロ引数は、文字列を置換するには、だけでなく、パラメータの引数を交換します。

:としてパラメータ化マクロ定義の一般的な形式
の#defineマクロ名(パラメータリスト)、または文字列式

各パラメータは、パラメータのパラメータリストは、カンマで区切られた文字列に含まれていてもよいです。

マクロ呼び出しを参照して一般的な形式:
マクロ名(引数リスト);
例えば:

#define M(Y)+ Y * Y * Y. 3 // マクロ
// コード 
K M =(5); // マクロコール

 

注意:

する#include <stdio.hの>
 に#define SQ(Y)(Y)*(Y)
 int型のmain(){
     int型A、SQ。
    printf(入力番号:)。
    scanf関数(" %のD "、& )。
    SQ = SQ(+ 1 )。
    printf(" SQ =%D \ n " 、SQ)。
    リターン 0 ; 
}
SQ =(+ 1) *(+ 1) 

結果:

入力A番号:9
SQ = 100

する#include <stdio.hの>
 に#define SQ(Y)Y * Yの
 INT のmain(){
     int型A、SQ。
    printf(入力番号:)。
    scanf関数(" %のD "、& )。
    SQ = SQ(+ 1 )。
    printf(" SQ =%D \ n " 、SQ)。
    リターン 0 ; 
}
SQ = A + 1 * A + 1 ;

結果:

入力番号:9
SQ = 19

 

条件付きコンパイル

⑴#もし...他に#...フォーマット

 

#ifの決意条件
           。コードセグメント1つ
の#else 
           コードセグメント2 
#endifの
または

の#if決意条件1 
           1コードセグメント
#elifの決意条件2 
           コード・セグメント2 
の#else 
           コードセグメント3 
#ENDIF

機能:および他の...式が同じであれば...。真と偽の存在を決定適したシーンは、この条件は一般的な表現です。


⑵#IFDEF ...#他に...または#IFNDEF ...#他に...フォーマット

#ifdefの識別子
           コード・セグメント1つ
の#else 
           コードセグメント2 
#endifの

または

#ifndefの識別子
           コードセグメント
の#else 
           コードセグメント2 
#ENDIF

特徴:メイン条件識別子(の#define定義)定義されているかどうかを確認するために判断されます。

実際には、このプロジェクトは、条件付きコンパイルを大量に使用します。その上で、条件付きコンパイルによって公式バージョンとデバッグバージョンを区別するために、そして、条件付きコンパイルを通じてプラットフォームと製品ラインの管理を実現するために、例えば、さまざまなハードウェアプラットフォームで条件付きコンパイルを使用します。

 

命令の前処理部

命令
#ダミー命令、何の効果の
ソースコードファイルを含んする#include
マクロために#defineを
定義されたマクロキャンセル#undefを
与えられた条件が真の場合の#ifは、以下のコンパイラコード
の#ifdefは、マクロが定義されていない場合、コンパイラは以下のコード
マクロが定義されていない場合#ifndefのは、以下のコンパイラコード
以前の条件が真でない場合は与えられたの#if #elifのは、現在の状況は、以下のコンパイラコード真である
#の#endifのエンド場合......#他の条件付きコンパイルブロック

 

おすすめ

転載: www.cnblogs.com/-wenli/p/12459416.html