C/C++宏替換實(shí)現(xiàn)詳解
基本形式
#define name replacement_text
通常情況下,#define 指令占一行,替換文本是 define 指令行尾部的所有剩余部分,但也可以把一個較長的宏定義分成若干行,這時需要在待續(xù)的行末尾加上一個反斜杠符 ``。
宏定義也可以帶參數(shù),這樣可以對不同的宏調(diào)用使用不同的替換文本。例:
#define max(A, B) ((A) > (B) ? (A) : (B))
宏展開中的陷阱
仔細(xì)考慮一下 max 的展開式,其中的表達(dá)式會被計(jì)算兩次,因此如果表達(dá)式中包含自增運(yùn)算符或輸入/輸出等行為,則會出現(xiàn)不正確的情況,例如上述的宏 max:
max(i++, j++) // wrong
另外還需要注意,適當(dāng)使用圓括號以保證計(jì)算次序的正確性,例如:
#define square(x) x * x // wrong
當(dāng)用 square(z+1) 調(diào)用該宏定義時會出錯。
#undef
在頭文件 <stdio.h> 中,getchar 與 putchar 函數(shù)在實(shí)際中常常被定義為宏,這樣可以避免處理字符時調(diào)用函數(shù)所需的運(yùn)行時開銷。<ctype.h> 頭文件中定義的函數(shù)也常常是通過宏實(shí)現(xiàn)的。
可以通過 #define 取消名字的宏定義,這樣做可以保證后續(xù)的調(diào)用是函數(shù)調(diào)用,而不是宏調(diào)用:
#undef getchar
int getchar(void) { ... }
宏參數(shù)、# 和 ##
如果在宏定義的替換文本中,參數(shù)名以 # 作為前綴則結(jié)果將被擴(kuò)展為由實(shí)際參數(shù)替換該參數(shù)的帶引號的字符串。例如,可以將它與字符串連接運(yùn)算結(jié)合起來編寫一個調(diào)試打印宏:
#define dprint(expr) printf(#expr " = %gn", expr)
使用語句
dprint(x/y);
調(diào)用該宏時,該宏將被擴(kuò)展為:
printf("x/y" " = %gn", x/y);
其中的字符串被拼接起來了,這樣,該宏調(diào)用的效果等價于
printf("x/y = %gn", x/y);
預(yù)處理器運(yùn)算符 ## 為宏擴(kuò)展提供了一種連接實(shí)際參數(shù)的手段。如果替換文本中的參數(shù)與 ## 相鄰,則該參數(shù)將被實(shí)際參數(shù)替代,## 與前后的空白符將被刪除,并對替換后的結(jié)果重新掃描。例如,下面定義的宏 paste 用于連接兩個參數(shù):
#define paste(front, back) front ## back
因此,宏調(diào)用 paste(name, 1) 的結(jié)果將建立記號 name1。
參考文獻(xiàn):
Brian W. Kernighan, Dennis M. Ritchie.The C Programming Language (Second Edition)[M].機(jī)械工業(yè)出版社:北京,2004:76-77.
到此這篇關(guān)于C/C++宏替換實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)C/C++宏替換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言之沒有main函數(shù)的helloworld示例
這篇文章主要介紹了C語言之沒有main函數(shù)的helloworld示例,本文分解了帶main函數(shù)的helloworld示例,從而分析出不需要main函數(shù)的helloworld示例,需要的朋友可以參考下2015-03-03
Visual Studio Code配置C、C++環(huán)境并編寫運(yùn)行的方法
這篇文章主要介紹了Visual Studio Code配置C、C++環(huán)境并編寫運(yùn)行的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要介紹了C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
c++使用Easyx圖形庫實(shí)現(xiàn)飛機(jī)大戰(zhàn)
本文詳細(xì)講解了c++使用Easyx圖形庫實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12
C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)化為后綴表達(dá)式詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C++解決實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式的問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03

