標籤:
預先處理
1、宏定義
2、條件編譯
3、檔案包含
注意:
1、所有預先處理都是以#開頭,並且結尾不用分號.
2、宏名一般用大寫字母,以便與變數名區別開來,但用小寫也沒有語法錯誤
3、範圍也是從定義到代碼塊結束
4、定義一個宏時可以引用已經定義的宏名
5、在編譯預先處理用字串替換宏名時,不作語法檢查,只是簡單的字串替換。只有在編譯的時候才對已經展開宏名的來源程式進行語法檢查
一、宏定義
1、不帶參數的宏定義
#define 宏名 字串
#define COUNT 6
2、帶參數的宏定義
#define 宏名(參數列表) 字串
#define sum(va,vb) ((va)+(vb))
注意:每個參數都要加括弧,運算結果也要加括弧
若需要提前取消宏定義可用 #undef COUNT實現。
程式碼範例
1 //宏名一般用大寫字母,以便與變數名區別開來,但用小寫也沒有語法錯誤 2 //1、宏定義1,不帶參數的宏定義,常用來定義常量 3 #define COUNT 6//後面麼有‘;‘ 4 5 #include <stdio.h> 6 //1、宏定義2,帶參數的宏定義,每個參數都要加括弧,運算結果也要加括弧 7 #define sum(v1,v2) ((v1)+(v2)) 8 9 10 int main()11 {12 //1、宏定義使用13 int array[COUNT] = {1,2,3,4,5,6};14 for (int i = 0; i < COUNT; i++)15 {16 printf("%d ",array[i]);17 }18 #undef COUNT //提前取消宏定義19 //帶參數的宏20 printf("\n%d\n",sum(10,20));21 printf("%d\n",sum(3,3)*sum(4,4));//這樣實際運行效果是3+3*4+4=19,因為宏只是簡單的文本替換,所以定義時加()比較好22 23 //2、條件編譯24 25 26 return 0;27 }
二、條件編譯
滿足條件就對代碼進行編譯,否則不編譯。
#if 條件1
.....
#elif 條件
......
#else
.....
#endif//不可缺少
1 #define COUNT 6//後面麼有‘;‘2 //2、條件編譯,一般判斷宏的值,不能對變數進行操作3 #if(COUNT == 6)4 printf("條件編譯:%d\n",COUNT);5 #elif (COUNT == 4)6 7 #else8 9 #endif//不可缺少#if defined()和#if !defined()的使用
#if defined(COUNT)//COUNT是一個宏,如果定義這個宏就執行下面的代碼
...code...
#endif
#if !defined(COUNT)//COUNT是一個宏,如果沒有定義這個宏就執行下面的代碼
...code...
#endif
代碼:
1 //#if defined()和#if !defined()的用法2 #if defined (COUNT)//如果定義宏就編譯下面代碼,否則不編譯3 printf("defined:%d\n",COUNT);4 #endif5 6 #if !defined (COUNT1)//如果定義宏就編譯下面代碼,否則不編譯7 printf("! defined\n");8 #endif
#ifdef和#ifndef的使用
#ifdef COUNT//COUNT是一個宏,如果定義這個宏就編譯下面的代碼 ...code...#endif
#ifndef COUNT//COUNT是一個宏,如果沒有定義這個宏就編譯下面的代碼 ...code...#endif
代碼:
1 //#ifdef和#ifndef的使用2 #ifdef COUNT//如果定義宏就編譯下面代碼,否則不編譯3 printf("ifdef:%d\n",COUNT);4 #endif5 6 #ifndef COUNT1//如果定義宏就編譯下面代碼,否則不編譯7 printf("ifndef\n");8 #endif
三、檔案包含
#include
#include <>//系統標頭檔
#include ""//自訂的標頭檔
檔案包含可能會重複包含同一個檔案,這是可以再要包含的檔案中添加一個宏定義,用於消除重複包含。
格式如下
#ifndef A_H
#def A_H
..........
#endif
這樣即使多次#include同一個標頭檔也不會產生檔案的重複性包含
2015-4-14 今日如此,明日依舊。
IOS開發學習筆記008