C C 預處理之 define

2021-06-22 18:22:25 字數 1323 閱讀 4145

define 是 c/c++ 中的一條預處理指令,# 用在一行的開始表示乙個預處理指令的開始;一條預處理指令以回車作為結束符,而不是以分號,分號會被替換掉。

#define m 4 //把 m 定義為 4

#define max(a,b)  (a) > (b) ? (a) : (b)//定義表示式,而不是定義函式。所有的 define 預處理都只是起替換作用

#define max (a,b)  (a) > (b) ? (a) : (b) //注意巨集名與巨集引數之前不能有空格。這種寫法一般是錯誤的,因為它把 max 替換為 (a,b) (a) > (b) ? (a) : (b) ,一般在編譯時期會報錯

一般 define 指令裡面會出現 # 和 ##,前乙個是將傳入的引數的名字作為引數的值,後乙個用於連線引數的名字

#define str(str) (#str)//以傳入的引數的名字作為字串的值,printf("%s\r\n",str(lizhihao)) 輸出 lizhihao

#define cons(a,b,c)   (a##b##c) //連線三個引數的名字,printf("%s\r\n",cons(2,3,4)) 輸出 234

當 define 定義中含有 # 或 ## 時,傳入的巨集不會被展開,而直接將表示式的名字作為值,如:

str(cons(a,b,c))  等於字串  "cons(a,b,c)"

cons(str(a),str(b),str(b)) 等價於字串 "str(a),str(b),str(b)" 

要解決這一問題,只需要用隔板巨集即可,在中間多乙個巨集將這種效果去除。

#define _str(str) (#str)

#define str(str) _str(str)//現在 str 的定義中不含 # 或 ## ,因此,傳入這個巨集定義的巨集會被展開

#define _cons(a,b,c)   (a##b##c) 

#define cons(a,b,c) _cons(a,b,c)

再使用

str(cons(a,b,c))便等於字串 "abc",而不是 "cons(a,b,c)"

str(cons(str(a),b,c)) 等於字串 ""a"bc ",注意這個字串中, a 的左右有雙引號。這是因為 str(a) 就是乙個字串,當 cons 接收引數時,編譯器知道,str(a)是乙個字串,故此時要讀它的值,而不是讀變數名,當然,此時它也沒有變數名,為了與傳入的其它引數 b , c 相區分,以說明 str(a) 是乙個字串,故特意在它的值的左右加雙引號,而後面的 b,c 直接以其名字作為字串的值。

類似的道理:

str(str(a)) 等於 "\"a\"" 這個字串, a 左右有雙引號。

預處理指令之define

define 指令是再學習c語言時接觸的第二個預處理指令,他的基本用法很簡單,但是高階使用卻可以實現很多複雜的功能,正是如此,也容易掉入坑里 define的最簡單用法就是巨集替換,將乙個巨集替換為指定的替換體。define pi 3.1415這個語句的會將檔案 現的pi 全字匹配,且不在字串中 替換...

預處理指令define

1 用預處理指令 define 宣告乙個常數,用以表明1年中有多少秒 忽略閏年問題 define seconds per year 60 60 24 365 ul 我在這想看到幾件事情 define 語法的基本知識 例如 不能以分號結束,括號的使用,等等 懂得預處理器將為你計算常數表示式的值,因此,...

預處理程式 define

巨集定義由三部分組成,中間用空格分開,define,巨集的名字,主體,巨集的命名和普通的變數命名規則相同,巨集可以被稱為類物件巨集,類函式巨集。define用來定義巨集 以下是程式在編譯前的處理步驟 1.預編譯前,刪除反斜線和換行符的組合,將每個注釋要乙個空格替代 2.進入預編譯時,尋找 由 開頭 ...