種類 : 宏定義 #define #ifdef #ifndef 文件包含 #include 條件編譯 #if–#else–#endif等 其他宏定義 #line #error #PRagma
不帶參數宏定義 一般形式 : #define 宏名 [宏體] 功能 : 用指定的宏名代替宏體
宏定義的規則 1.宏定義不是c語句,不必在行末加分號 2.在進行宏定義時可以引用自己已定義的宏名,可以層層替換。 3.宏定義只做字符替換,不分配內存空間 4.宏名的有限范圍為宏定義到本源文件結束 5.宏定義只做簡單的替換不做正確性檢查#define R 3.0#define PI 3.14#define L 2*PI*R帶參數宏定義一般形式 : #define 宏名(參數表) 宏體 宏展開 :形參用實參換,其他字符保留
宏定義特點 : 1.帶參數宏定義中,宏名與形參表之間不能有空格出現,例如,#define MAX(a,b) (a>b)?a:b。其中MAX與(a,b)之間不能有空格 2.在帶參宏定義中,形參表示不分配內存單元,因此不必作類型定義。 3.帶參的宏和帶參函數很相似,但有本質上的不同| / | 帶參宏 | 函數 |
|---|---|---|
| 處理時間 | 編譯時 | 程序運行時 |
| 參數類型 | 無類型問題 | 定義實參,形參類型 |
| 內存占用 | 不分配內存 | 分配內存 |
| 運行速度 | 不占運行時間 | 調用返回占用時間 |
當所指定的標識符已經被#define命令定義過,注意只是標識符被定義過即可,不管它是否成立。則在程序編譯階段之編譯程序段1,否則只編譯程序段2。 2.#if 如果定義表達式成立
#if 常量表達式 程序段1#else 程序段2#endif如果常量表達式的值為真(非0),則對程序段1進行編譯,否則對程序段2進行編譯。
3.# 字符串化操作符
#define mkstr(s) #sint main(void){ printf(mkstr(i like c)); return 0;}預處理程序將 printf(mkstr(i like c)); 變成 printf(“i like c”);
4.## 可以把兩個獨立的字符串連接成一個字符串
#define SORT(X) sort_function##Xint mian(void){ char *array; int elements, element_size; SORT(3)(array, elements,element_size);}預處理程序將SORT(3)轉換為sort_function3
新聞熱點
疑難解答