欢迎光临散文网 会员登陆 & 注册

【C/C++进阶】宏函数实用指南

2023-06-07 12:28 作者:双笙子佯谬  | 我要投稿

虽然模板取代了一部分宏函数的市场[星尘_啦啦啦]但是还有很多模板覆盖不到的地方[未来有你_酸了]不论是骨哥test[鹿乃桜帆_呆呆]骨哥benchmark[洛天依_啊!]zeno[星尘_震惊]boost[雪未来_赖床]openvdb[Akie秋绘_傲娇]都大量使用了宏函数来简化书写[雪未来_打气]

例如经典的骨哥test测试用例定义方法[未来有你_酸了]

TEST(mycase) {

 EXPECT_EQ(2 + 2, 5);

}

有没有想过这里的TEST是怎么实现的呢[星尘的新年祝福_嘿嘿]才能让后面紧跟着的块变成函数体[未来有你_SOS]这里的TEST(mycase)可能会展开成这样[星尘_给你星星](仅供学习演示[星尘_酸]实际以骨哥源码为准)[未来有你_生闷气]

static void mycase(); // 前向声明

static int mycase_reghelper = (g_casemap.emplace(“mycase”, mycase), 0); // 静态初始化注册,reghelper变量无意义,仅用于保证emplace这段代码在main前执行

static void mycase() // TEST(mycase)展开结束,由于你后面紧跟着{}所以会变成mycase函数的函数体,此后骨哥test在运行main的时候,就会遍历g_casemap里的测试用例运行并打印名字,当然实际这里mycase可能还有一些参数之类的,这里g_casemap可以是map<string, function<void()>>类型

这就是宏的魅力[未来有你_登场]在cpp模板仍不够完备的今天[海伊_大哭]起到类似自定义关键字的效果[海伊_比心]

还有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)

这些可都是模板函数做不到的哦[未来有你_酸了]

宏函数可能脏乱差[幻想乡的日常 第1弹_抱头蹲防]但绝不会没用[幻想乡的日常 第1弹_真香]指定编译期参数用的宏常量更不必多说[未来有你_登场]在发现模板函数隔靴搔痒时[星尘_大哭]就该果断选择成为宏孩儿[海伊_比心]保证甲方任务的高效完成[鹿乃桜帆_拜拜~]

【C/C++进阶】宏函数实用指南的评论 (共 条)

分享到微博请遵守国家法律