參考博客:https://mp.weixin.qq.com/s/qTFLZFL2IAz1ScrV1u313Q
宏分為兩種:Object-like 宏和Function-like 宏
Object-like 宏:
1、在宏定義時,通常宏的名稱都是用大寫字母表示,如果要換行就在行末使用\斷行。
2、在調(diào)用宏時,預處理器在替換宏的內(nèi)容時會繼續(xù)檢查宏的內(nèi)容本身是否也是宏定義,如果是,會繼續(xù)替換宏定義的內(nèi)容,直到全部展開。
3、宏定義以最后有效的定義為準。
例如:
#define M_PI 3.14159265358979323846264338327950288
#define MAX(a,b) ((a)>(b)?(a):(b))
#undef 宏名稱:可以取消宏定義。
Function-like 宏:
1.在“()”里可以添加參數(shù),以“,”分隔
2.使用 “#” 預處理操作符來實現(xiàn)將宏中的參數(shù)轉化為字符(串),這個操作會將參數(shù)中的所有字符都實現(xiàn)字符(串)化,包括引號,如果參數(shù)中間有很多空格,字符(串)化之后將會只用一個空格代替。
3.使用 “##” 操作符可以實現(xiàn)宏中token的連接
可變參數(shù)的宏:__VA_ARGS__
__VA_ARGS__:總體來說就是將左邊宏中 ... 的內(nèi)容原樣抄寫在右邊 __VA_ARGS__ 所在的位置。它是一個可變參數(shù)的宏,是新的C99規(guī)范中新增的。
例如:
#define BLOCK_EXEC(block, ...) if (block) { block(__VA_ARGS__); }
可以用來把block調(diào)用的參數(shù)傳遞過去;