1,預處理
預處理是指在進行編譯的第一遍掃瞄(詞法掃瞄和語法分析)之前所作的工作。預處理是c語言的乙個重要功能,它由預處理程式負責完成。當對乙個原始檔進行編譯時,系統將自動引用預處理程式對源程式中的預處理部分作處理,處理完畢自動進入對源程式的編譯。
c語言提供了多種預處理功能,如巨集定義、檔案包含、條件編譯等。
2,巨集定義
在c語言源程式中允許用乙個識別符號來表示乙個字串,稱為「巨集」
在c語言中,「巨集」分為有引數和無引數兩種。
3,無參巨集定義
格式: #define 識別符號 字串
說明:(1)巨集定義是用巨集名來表示乙個字串,在巨集展開時又以該字串取代巨集名,這只是一種簡單的代換,字串中可以含任何字元,可以是常數,也可以是表示式,預處理程式對它不作任何檢查。如有錯誤,只能在編譯已被巨集展開後的源程式時發現。
(2)巨集定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。
(3) 巨集定義必須寫在函式之外,其作用域為巨集定義命令起到源程式結束(類似全域性變數的作用域規則)。
(4)巨集名在源程式中若用雙引號括起來,則預處理程式不對其作巨集代換。
示例:
#define ok 100
int main()
輸出:
okok123
(5)巨集定義允許巢狀,在巨集定義的字串中可以使用已經定義的巨集名。在巨集展開時由預處理程式層層代換。
(6)可以用#undef 巨集名來結束巨集的作用域
4,帶參巨集定義
c語言允許巨集帶有引數。在巨集定義中的引數稱為形式引數,在巨集呼叫中的引數稱為實際引數。
對帶引數的巨集,在呼叫中,不僅要巨集展開,而且要用實參去代換形參。
帶參巨集定義的一般形式為:#define 巨集名(形參表) 字串 在字串中含有各個形參。
帶參巨集呼叫的一般形式為:巨集名(實參表);
示例:
#define f(x,y) if(x>y)x^=y^=x^=y
int main()
輸出:1 2 3
說明:(1)帶參巨集定義中,巨集名和形參表之間不能有空格出現。
(2)在帶參巨集定義中,形式引數不分配記憶體單元,因此不必作型別定義。
(3)在巨集定義中的形參是識別符號,而巨集呼叫中的實參可以是表示式。
5,#和##
#是字串化,##是拼接
示例:#includeusing namespace std;
#define v(x) #x
#define g(x,y) x##y
int main()
{ int a=5,a2=6;
cout《輸出:a6
C 預處理 巨集定義
開發乙個 c語言程式,讓它暫停 5 秒以後再輸出內容 helllo 並且要求跨平台,在 windows 和 linux 下 include 說明 在windows 作業系統和 linux作業系統下,生成原始碼不一樣 if win32 如果是windows平台,就執行 include elif lin...
C語言 巨集定義,預處理巨集
巨集是學習任何語言所不可缺少的,優秀的巨集定義可以使得 變得很簡潔且高效,有效地提高程式設計效率。巨集是一種預處理指令,它提供了一種機制,可以用來替換源 中的字串,直譯器或編譯器在遇到巨集時會自動進行這一模式替換 c語言有簡單的巨集系統,由編譯器或彙編器的預處理器實現。c的巨集預處理器的工作只是簡單...
c語言預處理 巨集定義
個人筆記 巨集定義對於用c語言程式設計的人是經常用,這裡只講使用中需注意的問題點和方便的用法。1.巨集擴充套件中空格對擴充套件結果的影響 define a y a expanded y a x 被擴充套件為 a expanded x define a y a expanded y a x 被擴充套件...