C前処理
3212 ワード
プリプロセッサは、マクロ置換、条件コンパイル、および指定されたファイルを実行します.#includeコマンド:コンパイル中にトップファイルの内容を現在のファイルに含めるために使用されます.defineコマンド:任意の文字シーケンスでタグを置き換えます.
1、ファイルに#includeコマンドを含めることは、すべてのソースファイルが同じ定義と変数(関数)宣言を持つことを保証するすべての宣言を一緒に置く良い方法です.ファイルを含むコンテンツが変更された場合は、ファイルを含むソースファイルに依存して再コンパイルする必要があります.
#include“file name”#include#include記号シーケンスはソースファイルにあり、上の行はファイル名で指定したファイル内容に置き換えられます.ファイル名が引用符で囲まれている場合は、ソースファイルの場所でファイルを検索します.この場所にファイルが見つからない場合や、ファイル名がカッコで囲まれている場合は、対応するルールに従ってファイルが検索されます.このルールは、実装に関連しています.
2.マクロ置換#define識別子記号シーケンス#define識別子(識別子テーブル)記号シーケンス#undef識別子プリプロセッサは、その識別子の後に現れる各インスタンスを所定の記号シーケンスで置換する.2回目に#define命令で同じ識別子を定義するのは、2回目の定義のタグシーケンスが1回目と同じでない限り、エラーです.
通常、#define命令は1行を占めますが、1つの長いマクロ定義をいくつかの行に分けることもできます.この場合、後続の行末に反スラッシュを付ける必要があります.置換は記号のみで行い、引用符で囲まれた文字列には機能しません.#define max(A, B) ((A) > (B) ? (A) : (B))
置換テキストで、パラメータ名が#を接頭辞とする場合、結果は実際のパラメータに置換された引用符付き文字列に拡張されます.#define DPRINT(expr)printf(#expr"=%g",expr)DPRINT(x/y)=>printf("x/y=%g",x/y)前処理演算子##は、マクロ拡張に実際のパラメータを接続する手段を提供する.置換テキストのパラメータが##に隣接している場合、そのパラメータは実際のパラメータに置き換えられ、##と前後の空白文字が削除され、置換後の結果が再スキャンされます.define PASTE(front, back) front##back PASTE(fight, ing) => fighting
3、条件には、前処理自体を制御できる条件文が含まれています.#if文は、その中の定数整形式を評価し、その式の値が0に等しくない場合、endif、elif、またはelse文に遭遇するまで、その後の各行を含む.if !defined(HDR) #define HDR ... #endif
1、ファイルに#includeコマンドを含めることは、すべてのソースファイルが同じ定義と変数(関数)宣言を持つことを保証するすべての宣言を一緒に置く良い方法です.ファイルを含むコンテンツが変更された場合は、ファイルを含むソースファイルに依存して再コンパイルする必要があります.
#include“file name”#include#include記号シーケンスはソースファイルにあり、上の行はファイル名で指定したファイル内容に置き換えられます.ファイル名が引用符で囲まれている場合は、ソースファイルの場所でファイルを検索します.この場所にファイルが見つからない場合や、ファイル名がカッコで囲まれている場合は、対応するルールに従ってファイルが検索されます.このルールは、実装に関連しています.
2.マクロ置換#define識別子記号シーケンス#define識別子(識別子テーブル)記号シーケンス#undef識別子プリプロセッサは、その識別子の後に現れる各インスタンスを所定の記号シーケンスで置換する.2回目に#define命令で同じ識別子を定義するのは、2回目の定義のタグシーケンスが1回目と同じでない限り、エラーです.
通常、#define命令は1行を占めますが、1つの長いマクロ定義をいくつかの行に分けることもできます.この場合、後続の行末に反スラッシュを付ける必要があります.置換は記号のみで行い、引用符で囲まれた文字列には機能しません.#define max(A, B) ((A) > (B) ? (A) : (B))
置換テキストで、パラメータ名が#を接頭辞とする場合、結果は実際のパラメータに置換された引用符付き文字列に拡張されます.#define DPRINT(expr)printf(#expr"=%g",expr)DPRINT(x/y)=>printf("x/y=%g",x/y)前処理演算子##は、マクロ拡張に実際のパラメータを接続する手段を提供する.置換テキストのパラメータが##に隣接している場合、そのパラメータは実際のパラメータに置き換えられ、##と前後の空白文字が削除され、置換後の結果が再スキャンされます.define PASTE(front, back) front##back PASTE(fight, ing) => fighting
3、条件には、前処理自体を制御できる条件文が含まれています.#if文は、その中の定数整形式を評価し、その式の値が0に等しくない場合、endif、elif、またはelse文に遭遇するまで、その後の各行を含む.if !defined(HDR) #define HDR ... #endif
#ifndef _CALU_H
#define _CALU_H
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
extern int add(int a, int b);
extern int sub(int a, int b);
extern int mul(int a, int b);
extern int div(int a, int b);
#endif
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
if (b != 0)
{
return a / b;
}
return 0;
}
#include "calu.h"
#define TEST_NUM 10
#define TEST_ADD
int main()
{
int i = 0;
int a = 3;
int b = 7;
int val = 0;
#if defined(TEST_ADD)
val = add(a, b);
#elif defined(TEST_MUL)
val = mul(a, b);
#else
val = sub(a, b);
val = div(a, b);
#endif
val = MIN(a, b);
val = MAX(a, b);
for (i = 0; i < TEST_NUM; i++) {
val = (val, b);
}
return 0;
}
# 1 "main.c"
# 1 ""
# 1 ""
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "" 2
# 1 "main.c"
# 1 "calu.h" 1
extern int add(int a, int b);
extern int sub(int a, int b);
extern int mul(int a, int b);
extern int div(int a, int b);
# 2 "main.c" 2
int main()
{
int i = 0;
int a = 3;
int b = 7;
int val = 0;
val = add(a, b);
val = ((a) < (b) ? (a) : (b));
val = ((a) > (b) ? (a) : (b));
for (i = 0; i < 10; i++) {
val = (val, b);
}
return 0;
}
:gcc -E main.c -o main.i
.i ( 、 )。