【C/C++進(jìn)階】宏函數(shù)實(shí)用指南

雖然模板取代了一部分宏函數(shù)的市場[星塵_啦啦啦]但是還有很多模板覆蓋不到的地方[未來有你_酸了]不論是骨哥test[鹿乃桜帆_呆呆]骨哥benchmark[洛天依_啊!]zeno[星塵_震驚]boost[雪未來_賴床]openvdb[Akie秋繪_傲嬌]都大量使用了宏函數(shù)來簡化書寫[雪未來_打氣]
例如經(jīng)典的骨哥test測試用例定義方法[未來有你_酸了]
TEST(mycase) {
?EXPECT_EQ(2 + 2, 5);
}
有沒有想過這里的TEST是怎么實(shí)現(xiàn)的呢[星塵的新年祝福_嘿嘿]才能讓后面緊跟著的塊變成函數(shù)體[未來有你_SOS]這里的TEST(mycase)可能會展開成這樣[星塵_給你星星](僅供學(xué)習(xí)演示[星塵_酸]實(shí)際以骨哥源碼為準(zhǔn))[未來有你_生悶氣]
static void mycase(); // 前向聲明
static int mycase_reghelper = (g_casemap.emplace(“mycase”, mycase), 0); // 靜態(tài)初始化注冊,reghelper變量無意義,僅用于保證emplace這段代碼在main前執(zhí)行
static void mycase() // TEST(mycase)展開結(jié)束,由于你后面緊跟著{}所以會變成mycase函數(shù)的函數(shù)體,此后骨哥test在運(yùn)行main的時(shí)候,就會遍歷g_casemap里的測試用例運(yùn)行并打印名字,當(dāng)然實(shí)際這里mycase可能還有一些參數(shù)之類的,這里g_casemap可以是map<string, function<void()>>類型
這就是宏的魅力[未來有你_登場]在cpp模板仍不夠完備的今天[海伊_大哭]起到類似自定義關(guān)鍵字的效果[海伊_比心]
還有PER類型的宏[未來有你_酸了]
#define PER_TYPE(type) if constexpr (is_same_v<T, type>) return #type; \
if constexpr (is_same_v<T, array<type, 3>>) return #type “3”;
PER_TYPE(float) PER_TYPE(int)
這些可都是模板函數(shù)做不到的哦[未來有你_酸了]
宏函數(shù)可能臟亂差[幻想鄉(xiāng)的日常 第1彈_抱頭蹲防]但絕不會沒用[幻想鄉(xiāng)的日常 第1彈_真香]指定編譯期參數(shù)用的宏常量更不必多說[未來有你_登場]在發(fā)現(xiàn)模板函數(shù)隔靴搔癢時(shí)[星塵_大哭]就該果斷選擇成為宏孩兒[海伊_比心]保證甲方任務(wù)的高效完成[鹿乃桜帆_拜拜~]