黑馬程式設計師——————c語言之預處理命令
阿新 • • 發佈:2019-01-30
一、什麼是預處理指令
1、C語言在對源程式進行編譯之前,會先對一些特殊的預處理指令作解釋,產生一個新的源程式(這個過程稱為編譯預處理),之後再進行通常的編譯
2、為了區分預處理指令和一般的C語句,所有預處理指令都以符號"#"開頭,並且結尾不用分號
3、預處理指令可以出現在程式的任何位置,它的作用範圍是從它出現的位置到檔案尾。習慣上我們儘可能將預處理指令寫在源程式開頭,這種情況下,它的作用範圍就是整個源程式檔案
4、C語言提供的預處理指令主要有:巨集定義、檔案包含、條件編譯
二、巨集定義
1> 不帶引數的巨集定義
格式
#define 巨集名 字串(如果沒必要,字串可以省略,即:#define 巨集名)
比如:
- #define PI 3.14
作用
在編譯預處理時,將源程式中所有"巨集名"替換成右邊的"字串",常用來定義常量。
在編譯預處理時,會把PI改成3.14,變成下面的樣子
- #define PI 3.14
- double value = 22 * PI * 3;
- double value = 22 * 3.14 * 3;
注意
* 巨集名一般用大寫字母,以便與變數名區別開來,但用小寫也沒有語法錯誤
* 在編譯預處理用字串替換巨集名時,不作語法檢查,只是簡單的字串替換。只有在編譯的時候才對已經展開巨集名的源程式進行語法檢查
* 巨集名的有效範圍是從定義位置到檔案結束。如果需要終止巨集定義的作用域,可以用#undef命令
* 定義一個巨集時可以引用已經定義的巨集名
- #define PI 3.14
- double value = 22 * PI * 3;
- #undef PI
- #define R 3.0
- #define PI 3.14
- #define L 2*PI*R
- #define S PI*R*R
2、帶引數的巨集定義
格式
#define 巨集名(引數列表) 字串比如:
- #define sum(a, b) (a+b)
作用
和不帶引數的巨集定義一樣注意
* 巨集名和引數列表之間不能有空格,否則空格後面的所有字串都作為替換的字串
* 帶引數的巨集在展開時,只作簡單的字元和引數的替換,不進行任何計算操作。所以在定義巨集時,一般用一個小括號括住字串的引數。
輸出:
- #include <stdio.h>
- #define multi(a) 3*a
- int main()
- {
- int value = multi(4 + 5);
- printf("%d\n", value);
- return0;
- }
17
按照我的設想是輸出27,為什麼輸出了17,這是為什麼呢,這是因為在編譯預處理時 multi(4 + 5) 會被翻譯成 3 * 4 + 5,所以結果是17
* 計算結果最好也用括號括起來
輸出:
- #include <stdio.h>
- #define func(a) (a)*(a)
- int main()
- {
- int value = func(6)/func(3);
- printf("%d\n", value);
- return0;
- }
36
我們預期的輸出是 4,結果卻是36,原因就是 func(6)/func(3) 被翻譯成 (6)*(6)/(3)*(3),所以是36與函式的區別
* 巨集定義不涉及儲存空間的分配、引數型別匹配、引數傳遞、返回值問題
* 函式呼叫在程式執行時執行,而巨集替換隻在編譯預處理階段進行。所以帶引數的巨集比函式具有更高的執行效率
三、檔案包含
作用
將一個檔案的全部內容拷貝另一個檔案中包含系統檔案
#include <檔名>包含自定義檔案
#include “檔名”注意
* 允許巢狀包含,但不允許遞迴包含
* 可以多次包含同一標頭檔案,但是會減低效率解決:在每個含檔案的開頭和末尾新增下面程式碼
- // 檔案開頭
- #ifndef A_FILE
- #define A_FILE
- //定義的內容
- // 檔案結尾
- #endif
四、條件編譯
概念
在滿足一定條件的情況下才編譯某些內容用法
解釋:
- #if 條件1
- ...code1...
- #elif 條件2
- ...code2...
- #else
- ...code3...
- #endif
如果滿足條件1,就只編譯code1,滿足條件2,就只編譯code2,否則編譯code3其他用法
- #if defined(A)
- // code
- #endif
- #if !defined(A)
- // code
- #endif
- // 和if defined(A) 用法一樣
- #ifdef A
- // code
- #endif
- // 和if !defined(!) 用法一樣
- #ifndef A
- // code
- #endif