1. 程式人生 > >黑馬程式設計師——————c語言之預處理命令

黑馬程式設計師——————c語言之預處理命令

一、什麼是預處理指令

1、C語言在對源程式進行編譯之前,會先對一些特殊的預處理指令作解釋,產生一個新的源程式(這個過程稱為編譯預處理),之後再進行通常的編譯
2、為了區分預處理指令和一般的C語句,所有預處理指令都以符號"#"開頭,並且結尾不用分號
3、預處理指令可以出現在程式的任何位置,它的作用範圍是從它出現的位置到檔案尾。習慣上我們儘可能將預處理指令寫在源程式開頭,這種情況下,它的作用範圍就是整個源程式檔案
4、C語言提供的預處理指令主要有:巨集定義、檔案包含、條件編譯

二、巨集定義

1> 不帶引數的巨集定義

格式

#define 巨集名 字串(如果沒必要,字串可以省略,即:#define 巨集名)
比如:
  1. #define PI 3.14   

作用

在編譯預處理時,將源程式中所有"巨集名"替換成右邊的"字串",常用來定義常量。
  1. #define PI 3.14
  2. double value = 22 * PI * 3;  
在編譯預處理時,會把PI改成3.14,變成下面的樣子
  1. double value = 22 * 3.14 * 3;  

注意

* 巨集名一般用大寫字母,以便與變數名區別開來,但用小寫也沒有語法錯誤
* 在編譯預處理用字串替換巨集名時,不作語法檢查,只是簡單的字串替換。只有在編譯的時候才對已經展開巨集名的源程式進行語法檢查
* 巨集名的有效範圍是從定義位置到檔案結束。如果需要終止巨集定義的作用域,可以用#undef命令
  1. #define PI 3.14
  2. double value = 22 * PI * 3;  
  3. #undef PI
* 定義一個巨集時可以引用已經定義的巨集名
  1. #define R  3.0
  2. #define PI 3.14
  3. #define L  2*PI*R
  4. #define S  PI*R*R

2、帶引數的巨集定義

格式

#define 巨集名(引數列表) 字串比如:
  1. #define sum(a, b) (a+b)

作用

和不帶引數的巨集定義一樣

注意

巨集名和引數列表之間不能有空格,否則空格後面的所有字串都作為替換的字串
* 帶引數的巨集在展開時,只作簡單的字元和引數的替換,不進行任何計算操作。所以在定義巨集時,一般用一個小括號括住字串的引數

  1. #include <stdio.h>
  2. #define multi(a) 3*a
  3. int main()  
  4. {  
  5.     int value = multi(4 + 5);  
  6.     printf("%d\n", value);  
  7.     return0;  
  8. }  
輸出:

17

按照我的設想是輸出27,為什麼輸出了17,這是為什麼呢,這是因為在編譯預處理時 multi(4 + 5) 會被翻譯成 3 * 4 + 5,所以結果是17
計算結果最好也用括號括起來
  1. #include <stdio.h>
  2. #define func(a) (a)*(a)
  3. int main()  
  4. {  
  5.     int value = func(6)/func(3);  
  6.     printf("%d\n", value);  
  7.     return0;  
  8. }  
輸出:

36

我們預期的輸出是 4,結果卻是36,原因就是 func(6)/func(3) 被翻譯成 (6)*(6)/(3)*(3),所以是36

與函式的區別

* 巨集定義不涉及儲存空間的分配、引數型別匹配、引數傳遞、返回值問題
* 函式呼叫在程式執行時執行,而巨集替換隻在編譯預處理階段進行。所以帶引數的巨集比函式具有更高的執行效率

三、檔案包含

作用

將一個檔案的全部內容拷貝另一個檔案中

包含系統檔案

#include <檔名>

包含自定義檔案

#include “檔名”

注意

* 允許巢狀包含,但不允許遞迴包含
* 可以多次包含同一標頭檔案,但是會減低效率
解決:在每個含檔案的開頭和末尾新增下面程式碼
  1. // 檔案開頭
  2. #ifndef A_FILE
  3. #define A_FILE
  4. //定義的內容
  5. // 檔案結尾
  6. #endif

四、條件編譯

概念

在滿足一定條件的情況下才編譯某些內容

用法

  1. #if 條件1
  2.  ...code1...  
  3. #elif 條件2
  4.  ...code2...  
  5. #else
  6.  ...code3...  
  7. #endif
解釋:
如果滿足條件1,就只編譯code1,滿足條件2,就只編譯code2,否則編譯code3

其他用法

  1. #if defined(A)
  2.     // code
  3. #endif
  4. #if !defined(A)
  5.     // code
  6. #endif
  7. // 和if defined(A) 用法一樣
  8. #ifdef A
  9.     // code
  10. #endif
  11. // 和if !defined(!) 用法一樣
  12. #ifndef A
  13.     // code
  14. #endif