1.前處理器:
前處理器不是編譯器的組成部分,但是它是編譯程序中一個單獨的步驟,簡言之,C 前處理器只不過是一個文本替換工具而已,它們會指示編譯器在實際編譯之前完成所需的預處理,
我們將把 C 前處理器(C Preprocessor)簡寫為 CPP,
所有的前處理器命令都是以井號(#)開頭,它必須是第一個非空字符,為了增強可讀性,前處理器指令應從第一列開始,具體的串列可以在網上找到,這里不再復述,
a.幾個常用的:
#define MAX_ARRAY_LENGTH 20 (所有的MAX_ARRAY_LENGTH 替換為 20)
#include <stdio.h>
#include "myheader.h" (這兩行指令告訴 CPP 從系統庫中獲取 stdio.h,并添加文本到當前的源檔案中,下一行告訴 CPP 從本地目錄中獲取 myheader.h,并添加內容到當前的源檔案中,)
b.預定義宏:
不能修改的預定義宏,可以根據情況使用:
__DATE__ 當前日期,一個以 "MMM DD YYYY" 格式表示的字符常量,
__TIME__ 當前時間,一個以 "HH:MM:SS" 格式表示的字符常量
__FILE__ 這會包含當前檔案名,一個字串常量,
__LINE__ 這會包含當前行號,一個十進制常量,
__STDC__ 當編譯器以 ANSI 標準編譯時,則定義為 1,
c.前處理器運算子:
宏延續運算子(\):一個宏通常寫在一個單行上,但是如果宏太長,一個單行容納不下,則使用宏延續運算子.
字串常量化運算子(#):在宏定義中,當需要把一個宏的引數轉換為字串常量時,則使用字串常量化運算子(#),在宏中使用的該運算子有一個特定的引數或引數串列.
標記粘貼運算子(##):宏定義內的標記粘貼運算子(##)會合并兩個引數,它允許在宏定義中兩個獨立的標記被合并為一個標記,
d.引數化的宏:
CPP 一個強大的功能是可以使用引數化的宏來模擬函式:
int square(int x)
{
return x * x;
}
這段代碼可以用宏重寫:
#define square(x) ((x) * (x)) //注意所有的引數都要括號,不然運算錯誤
2.頭檔案呼叫:
頭檔案是擴展名為 .h 的檔案,包含了 C 函式宣告和宏定義,被多個源檔案中參考共享,有兩種型別的頭檔案:程式員撰寫的頭檔案和編譯器自帶的頭檔案,
在程式中要使用頭檔案,需要使用 C 預處理指令 #include 來參考它,前面我們已經看過 stdio.h 頭檔案,它是編譯器自帶的頭檔案,
參考頭檔案相當于復制頭檔案的內容,但是我們不會直接在源檔案中復制頭檔案的內容,因為這么做很容易出錯,特別在程式是由多個源檔案組成的時候,
A simple practice in C 或 C++ 程式中,建議把所有的常量、宏、系統全域變數和函式原型寫在頭檔案中,在需要的時候隨時參考這些頭檔案,
a.參考:
#include <file> //參考的是編譯器的類別庫路徑里面的頭檔案,
或者
#include "file" //參考的是你程式目錄的相對路徑中的頭檔案,如果在程式目錄沒有找到參考的頭檔案則到編譯器的類別庫路徑的目錄下找該頭檔案,
都可以,
b.具體操作:
#include 指令會指示 C 前處理器瀏覽指定的檔案作為輸入,前處理器的輸出包含了已經生成的輸出,被參考檔案生成的輸出以及 #include 指令之后的文本輸出,
int x;
#include "header.h" // 假如頭檔案里只有“char *test (void);” ,這一段就會被那句話替代
int main (void) {
puts (test ());
}
c. 只參考一次:
如果一個頭檔案被參考兩次,編譯器會處理兩次頭檔案的內容,這將產生錯誤,為了防止這種情況,標準的做法是把檔案的整個內容放在條件編譯陳述句中.
#ifndef HEADER_FILE
#define HEADER_FILE
,,, //頭檔案串列
#endif
d.有條件的參考:
有時需要從多個不同的頭檔案中選擇一個參考到程式中,例如,需要指定在不同的作業系統上使用的配置引數:
#if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3
...
#endif
但是如果頭檔案比較多的時候,這個方法不是很好,所以我們用下面:
#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H
SYSTEM_H 會擴展,前處理器會查找 system_1.h,就像 #include 最初撰寫的那樣,SYSTEM_H 可通過 -D 選項被您的 Makefile 定義,
sub:在有多個 .h 檔案和多個 .c 檔案的時候,往往我們會用一個 global.h 的頭檔案來包括所有的 .h 檔案,然后在除 global.h 檔案外的頭檔案中 包含 global.h 就可以實作所有頭檔案的包含,同時不會亂,方便在各個檔案里面呼叫其他檔案的函式或者變數,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61753.html
標籤:C
上一篇:哈夫曼樹的構建(C語言)
