C語(yǔ)言編程過(guò)程中,經(jīng)常會(huì)用到如 #include、#define 等指令,這些標(biāo)識(shí)開頭的指令被稱為預(yù)處理指令,預(yù)處理指令由預(yù)處理程序(預(yù)處理器)操作。
相比其他編程語(yǔ)言,C/C++ 語(yǔ)言更依賴預(yù)處理器,故在閱讀或開發(fā) C/C++ 程序過(guò)程中,可能會(huì)接觸大量的預(yù)處理指令。
1
預(yù)處理指令及分類C/C++ 程序中的源代碼中包含以 # 開頭的各種編譯指令,這些指令稱為預(yù)處理指令。預(yù)處理指令不屬于 C/C++ 語(yǔ)言的語(yǔ)法,但在一定意義上可以說(shuō)預(yù)處理擴(kuò)展了 C/C++。
ANSI C 定義的預(yù)處理指令主要包括:文件包含、宏定義、條件編譯和特殊控制等 4 類。
1. 文件包含
文件包含:#include 是 C 程序設(shè)計(jì)中最常用的預(yù)處理指令。例如,幾乎每個(gè)需要輸入輸出的 C 程序,都要包含 #include《stdio.h》 指令,表示把 stdio.h 文件中的全部?jī)?nèi)容,替換該行指令。
包含文件的格式有 #include 后面跟尖括號(hào) 《》 和雙引號(hào) “” 之分。兩者的主要差別是搜索路徑的不同。
尖括號(hào)形式:如 #include《math.h》,預(yù)處理器直接到系統(tǒng)目錄對(duì)應(yīng)文件中搜索 math.h 文件,搜索不到則報(bào)錯(cuò)。系統(tǒng)提供的頭文件一般采用該包含方式,而自定義的頭文件不能采用該方式。
雙引號(hào)形式:如 #include“cal.h”,首先到當(dāng)前工作目錄下查找該文件,如果沒(méi)有找到,再到系統(tǒng)目錄下查找。包含自定義的頭文件,一般采用該方式。雖然系統(tǒng)頭文件采用此方式也正確,但浪費(fèi)了不必要的搜索時(shí)間,故系統(tǒng)頭文件不建議采用該包含方式。
2.宏定義
宏定義:包括定義宏 #define 和宏刪除 #undef。
以 #define 開頭,可以定義無(wú)參數(shù)宏和帶參的宏定義。程序中經(jīng)常使用無(wú)參宏定義來(lái)定義符號(hào)常量。例如:
#define PI 3.1416 //定義無(wú)符號(hào)宏,或定義符號(hào)常量 PI
#undef 表示刪除已定義的宏,例如:
#undef PI //刪除前面該宏的定義
3.條件編譯
條件編譯:主要是為了有選擇性地執(zhí)行相應(yīng)操作,防止宏替換內(nèi)容(如文件等)的重復(fù)包含。
常見(jiàn)的條件編譯指令有 #if、#elif、#else、#endif、#ifdef、#ifndef。
4.特殊控制
特殊控制:ANSI C 還定義了特殊作用的預(yù)處理指令,如 #error、#pragma。
#error:使預(yù)處理器輸出指定的錯(cuò)誤信息,通常用于調(diào)試程序。
#pragma:是功能比較豐富且靈活的指令,可以有不同的參數(shù)選擇,從而完成相應(yīng)的特 定功能操作。調(diào)用格式為:#pragma 參數(shù)。
其中,參數(shù)可以有 message 類型、code_seg、once、warning、pack 等。通常使用如下的預(yù)處理指令來(lái)設(shè)定內(nèi)存以 n 字節(jié)對(duì)齊方式。
#pragma pack (n) //其中 n 稱為對(duì)齊系數(shù),取 1、2、4、8.。.
2
預(yù)處理器及其工作原理
C預(yù)處理器(C Pre-Processor)也常簡(jiǎn)寫為 CPP,是一個(gè)與 C 編譯器獨(dú)立的小程序,預(yù)編譯器并不理解 C 語(yǔ)言語(yǔ)法,它僅是在程序源文件被編譯之前,實(shí)現(xiàn)文本替換的功能。
目前預(yù)編譯器巳集成到集成開發(fā)環(huán)境中,一般并沒(méi)有執(zhí)行預(yù)處理操作的選項(xiàng),而包含在了編譯操作中,即選擇編譯操作時(shí),首先調(diào)用的是預(yù)處理器,處理源程序文件中的預(yù)處理指令,預(yù)處理器的輸出再送給編譯器,編譯器從 C 語(yǔ)言語(yǔ)法角度檢查程序是否正確,如果正確,則生成目標(biāo)代碼文件或機(jī)器指令文件。
C 預(yù)處理器及 C 編譯器的執(zhí)行順序及輸入輸出文件類型,如圖所示:
責(zé)任編輯:lq
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7628瀏覽量
139754 -
C++
+關(guān)注
關(guān)注
22文章
2116瀏覽量
74586 -
預(yù)處理
+關(guān)注
關(guān)注
0文章
33瀏覽量
10583
原文標(biāo)題:C語(yǔ)言預(yù)處理命令分類和工作原理
文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
FPGA Verilog HDL語(yǔ)法之編譯預(yù)處理

全套C語(yǔ)言培訓(xùn)資料—PPT課件
如何優(yōu)化自然語(yǔ)言處理模型的性能
Minitab 數(shù)據(jù)清理與預(yù)處理技巧
C語(yǔ)言關(guān)鍵字分別發(fā)生在哪個(gè)階段
C語(yǔ)言生成可執(zhí)行二進(jìn)制文件的具體過(guò)程

評(píng)論