C言語第14課——プリプロセッサ
2742 ワード
プリプロセッサ
Cプリプロセッサはコンパイラの構成部分ではありませんが、コンパイル中の個別のステップです.簡単に言えば、Cプリプロセッサはテキスト置換ツールにすぎず、コンパイラが実際のコンパイル前に必要な前処理を完了することを示します.Cプリプロセッサ(C Preprocessor)はCPPと略記されている.
すべてのプリプロセッサコマンドは、井戸番号(#)で始まります.読み取り可能性を向上させるために、プリプロセッサコマンドは最初の列から開始する必要があります.
以下に、すべての重要なプリプロセッサ命令を示します.
インストラクション
説明
#define
定義マクロ
#include
ソースファイルを含む
#undef
定義済みマクロのキャンセル
#ifdef
マクロが定義されている場合は、真を返します.
#ifndef
マクロが定義されていない場合は、真を返します.
#if
与えられた条件が真である場合、次のコードをコンパイルします.
#else
#ifの代替案
#elif
前の#ifで与えられた条件が真でなく、現在の条件が真である場合、次のコードをコンパイルします.
#endif
1つの#if......#else条件コンパイルブロックを終了する
#error
標準エラーが発生した場合、エラーメッセージが出力されます.
#pragma
標準化された方法を使用して、コンパイラに特殊なコマンドをコンパイラにパブリッシュします.
≪インスタンス|Instance|emdw≫
すべてのMAXをARRAY_LENGTHを20に置き換えます.
システムライブラリからstdioを取得する.h、現在のソースファイルにテキストを追加します.ローカルディレクトリからmyheaderを取得h、現在のソースファイルにコンテンツを追加します.
定義済みFILEをキャンセルSIZEは、42と定義されている.
MESSAGEは、MESSAGEが定義されていない場合にのみ定義されます.
DEBUGが定義されている場合、処理文が実行されます.コンパイル時に、gccコンパイラに-DDeBUGスイッチ量を渡すと、このコマンドは非常に役立ちます.
定義済みマクロ
ANSI Cは多くのマクロを定義している.これらのマクロはプログラミングで使用できますが、事前定義されたマクロを直接変更することはできません.
マクロ#マクロ#
説明
__DATE__
現在の日付は、「MMM DD YYYY」形式で表される文字定数です.
__TIME__
現在時刻は、「HH:MM:SS」形式で表される文字定数です.
__FILE__
これには、現在のファイル名、文字列定数が含まれます.
__LINE__
これには、現在の行番号と10進数定数が含まれます.
__stdC__
コンパイラがANSI規格でコンパイルされている場合、定義は1です.
プリプロセッサ演算子
マクロ継続演算子()
1つのマクロは通常1つのローに書かれます.ただし、マクロが長すぎて1行に収まらない場合は、マクロ継続演算子()を使用します.
文字列定数演算子(#)
マクロ定義では、マクロのパラメータを文字列定数に変換する必要がある場合、文字列定数化演算子(#)が使用されます.マクロで使用される演算子には、特定のパラメータまたはパラメータのリストがあります.
タグ貼り付け演算子(##)
マクロ定義内のタグ貼り付け演算子(##)は、2つのパラメータを結合します.マクロ定義内の2つの独立したタグを1つのタグに結合できます.次に例を示します.
パラメトリックマクロ
パラメータ付きマクロを使用する前に、#defineコマンド定義を使用する必要があります.パラメータリストはカッコで囲まれており、マクロ名の後ろに続く必要があります.マクロ名と左かっこの間にスペースは許可されません.
Cプリプロセッサはコンパイラの構成部分ではありませんが、コンパイル中の個別のステップです.簡単に言えば、Cプリプロセッサはテキスト置換ツールにすぎず、コンパイラが実際のコンパイル前に必要な前処理を完了することを示します.Cプリプロセッサ(C Preprocessor)はCPPと略記されている.
すべてのプリプロセッサコマンドは、井戸番号(#)で始まります.読み取り可能性を向上させるために、プリプロセッサコマンドは最初の列から開始する必要があります.
以下に、すべての重要なプリプロセッサ命令を示します.
インストラクション
説明
#define
定義マクロ
#include
ソースファイルを含む
#undef
定義済みマクロのキャンセル
#ifdef
マクロが定義されている場合は、真を返します.
#ifndef
マクロが定義されていない場合は、真を返します.
#if
与えられた条件が真である場合、次のコードをコンパイルします.
#else
#ifの代替案
#elif
前の#ifで与えられた条件が真でなく、現在の条件が真である場合、次のコードをコンパイルします.
#endif
1つの#if......#else条件コンパイルブロックを終了する
#error
標準エラーが発生した場合、エラーメッセージが出力されます.
#pragma
標準化された方法を使用して、コンパイラに特殊なコマンドをコンパイラにパブリッシュします.
≪インスタンス|Instance|emdw≫
#define MAX_ARRAY_LENGTH 20
すべてのMAXをARRAY_LENGTHを20に置き換えます.
#include
#include "myheader.h"
システムライブラリからstdioを取得する.h、現在のソースファイルにテキストを追加します.ローカルディレクトリからmyheaderを取得h、現在のソースファイルにコンテンツを追加します.
#undef FILE_SIZE
#define FILE_SIZE 42
定義済みFILEをキャンセルSIZEは、42と定義されている.
#ifndef MESSAGE
#define MESSAGE "You wish!"
#endif
MESSAGEは、MESSAGEが定義されていない場合にのみ定義されます.
#ifdef DEBUG
/* Your debugging statements here */
#endif
DEBUGが定義されている場合、処理文が実行されます.コンパイル時に、gccコンパイラに-DDeBUGスイッチ量を渡すと、このコマンドは非常に役立ちます.
定義済みマクロ
ANSI Cは多くのマクロを定義している.これらのマクロはプログラミングで使用できますが、事前定義されたマクロを直接変更することはできません.
マクロ#マクロ#
説明
__DATE__
現在の日付は、「MMM DD YYYY」形式で表される文字定数です.
__TIME__
現在時刻は、「HH:MM:SS」形式で表される文字定数です.
__FILE__
これには、現在のファイル名、文字列定数が含まれます.
__LINE__
これには、現在の行番号と10進数定数が含まれます.
__stdC__
コンパイラがANSI規格でコンパイルされている場合、定義は1です.
プリプロセッサ演算子
マクロ継続演算子()
1つのマクロは通常1つのローに書かれます.ただし、マクロが長すぎて1行に収まらない場合は、マクロ継続演算子()を使用します.
文字列定数演算子(#)
マクロ定義では、マクロのパラメータを文字列定数に変換する必要がある場合、文字列定数化演算子(#)が使用されます.マクロで使用される演算子には、特定のパラメータまたはパラメータのリストがあります.
#include
#define message_for(a, b) \
printf(#a " and " #b ": We love you!
")
int main(void)
{
message_for(Carole, Debra);
return 0;
}
タグ貼り付け演算子(##)
マクロ定義内のタグ貼り付け演算子(##)は、2つのパラメータを結合します.マクロ定義内の2つの独立したタグを1つのタグに結合できます.次に例を示します.
#include
#define tokenpaster(n) printf ("token" #n " = %d", token##n)
int main(void)
{
int token34 = 40;
tokenpaster(34);
return 0;
}
パラメトリックマクロ
パラメータ付きマクロを使用する前に、#defineコマンド定義を使用する必要があります.パラメータリストはカッコで囲まれており、マクロ名の後ろに続く必要があります.マクロ名と左かっこの間にスペースは許可されません.
#define square(x) ((x) * (x))