【C/C++】宏参数多对一和宏部分替换
宏参数多对一:使用分号分隔多参数
宏部分替换:替换需要转换的再与后续宏接续
#include <stdio.h>
#define _MESS_FAILED() printf("%s %d: ASSERT FAILED\r\n", __func__, __LINE__)
#define TU_BREAKPOINT() \
do { \
printf("TU_BREAKPOINT()\n"); \
} while (0)
#define TU_VERIFY_DEFINE(_cond, _handler, _ret) \
do { \
if (!(_cond)) { \
_handler; \
return _ret; \
} \
} while(0)
#define GET_3RD_ARG(arg1, arg2, arg3, ...) arg3
// 宏参数多对一 ';'
#define ASSERT_1ARGS(_cond) TU_VERIFY_DEFINE(_cond, _MESS_FAILED(); TU_BREAKPOINT(), false)
#define ASSERT_2ARGS(_cond, _ret) TU_VERIFY_DEFINE(_cond, _MESS_FAILED(); TU_BREAKPOINT(), _ret)
// 宏部分替换
#define TU_ASSERT(...) GET_3RD_ARG(__VA_ARGS__, ASSERT_2ARGS, ASSERT_1ARGS, UNUSED)(__VA_ARGS__)
typedef enum{false, true} bool;
bool assert_function_true(void)
{
TU_ASSERT(true);
}
bool assert_function_false(void)
{
TU_ASSERT(false);
}
int main()
{
/* Write C code in this online editor and run it. */
printf("Hello, World! \n");
TU_ASSERT(1);
printf("-------------------------\n");
printf("%d\n", assert_function_true());
printf("-------------------------\n");
printf("%d\n", assert_function_false());
printf("-------------------------\n");
TU_ASSERT(0);
return 0;
}
执行结果:

【C/C++】宏参数多对一和宏部分替换的更多相关文章
- C/C++语言中#的神奇作用:把宏参数字符串化/贴合宏参数
宏中"#"和"##"的用法 一.一般用法 我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. #define STR(s) #s # ...
- 宏参数(Arguments)的扩展
宏分为两种,一种是 object-like 宏,比如: #define STR "Hello, World!" 另一种是 function-like 宏,比如: #define M ...
- C语言不支持默认参数,不过可以用宏来模拟
C语言不支持默认参数,不过可以用宏来模拟: //--------------------------------------------------------------------------- ...
- C/C++中 # 的神奇作用:把宏参数字符串化/贴合宏参数
一.一般用法 我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. #define STR(s) #s #define CONS(a,b) int(a##e##b) printf(ST ...
- Confluence 6.15 博客页面(Blog Posts)宏参数
参数是让你可以用来控制宏的格式和输出的选项.在 Confluence 存储格式或者 Wiki 标记(wikimarkup)中使用的参数名与在宏浏览器中使用的标签名是不同的,在下面我们将会用括号列出 ...
- C语言之带有数量可变的宏参数#define
1.定义格式如下 #define PR(...) printf(__VA_ARGS__) ...表示可变参数,__VA_ARGS__的作用是替换省略号的内容. 2.示例 #define ERROR( ...
- C语言:宏参数的字符串化和宏参数的连接
在宏定义中,有时还会用到#和##两个符号,它们能够对宏参数进行操作. # 的用法 #用来将宏参数转换为字符串,也就是在宏参数的开头和末尾添加引号.例如有如下宏定义: #define STR(s) #s ...
- macro-name replacement-text 宏 调试开关可以使用一个宏来实现
C++ 预处理器_w3cschool https://www.w3cschool.cn/cpp/cpp-preprocessor.html C++ 预处理器 预处理器是一些指令,指示编译器在实际编译之 ...
- 宏定义(无参宏定义和带参宏定义),C语言宏定义详解
1.宏定义说明 宏定义是比较常用的预处理指令,即使用"标识符"来表示"替换列表"中的内容.标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏 ...
- macro-name replacement-text 宏 调试开关可以使用一个宏来实现 do { } while(0)
C++ 预处理器_w3cschool https://www.w3cschool.cn/cpp/cpp-preprocessor.html C++ 预处理器 预处理器是一些指令,指示编译器在实际编译之 ...
随机推荐
- 为什么许多数字孪生产品开始了GIS融合的尝试?
随着数字孪生技术的发展,越来越多的产品意识到要实现数字孪生的最大价值,需要考虑多个维度的数据,包括空间信息.地理位置.环境条件等.因此,许多数字孪生产品开始了与GIS系统的融合尝试,以进一步提升其功能 ...
- C++ 动态库热加载
C++ 动态库热加载 本文参考自 project-based-learning 中的 Build a Live Code-reloader Library for C++,主要内容都来自于其中,但是对 ...
- Java 编辑、删除Excel中的超链接
本文介绍如何编辑Excel文档中的超链接,包括编辑超链接显示文本.链接地址及删除指定超链接.使用免费版Excel类库工具,Free Spire.XLS for Java.Jar包获取可在官方网站下载, ...
- 用GaussDB(for Redis)存画像,推荐业务轻松降本60%
摘要:用户画像存储是推荐业务核心,但开源Redis无法胜任.华为云高斯Redis是最佳存储选型,轻松降本60%,同时获得企业级高稳定性. 本文分享自华为云社区<华为云GaussDB(for Re ...
- 没有苹果开发者账号能否创建ios证书-最新
摘要: 本文介绍了在没有Mac电脑的情况下,使用appuploader工具生成iOS证书和描述文件的方法.随着大前端和H5框架的热门话题,越来越多的人希望将H5应用打包成iOS应用.苹果官方提供的 ...
- 火山引擎 DataTester 上线“流程画布”功能,支持组合型 A/B 实验分析
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在精细化运营的时代,运营活动同样需要有精细化的策略,例如在年末大促活动中,设计 APP 弹窗提醒.满减.会员领券时 ...
- 高性能 Jsonpath 框架,Snack3 3.2.54 发布(支持 kotlin data 类反序化)
Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计.其下一切数据都以ONode表示,ONode也 ...
- Pycharts在测试工作中的应用
Pycharts在测试工作中的应用 pycharts是一个基于Python的数据可视化库,支持多种折线图.柱状图.饼图等.Pycharts底层依赖于Echarts pip install pyecha ...
- Hadoop面试题(一)
1.集群的最主要瓶颈 磁盘IO 2.Hadoop运行模式 单机版.伪分布式模式.完全分布式模式 3.Hadoop生态圈的组件并做简要描述 1)Zookeeper:是一个开源的分布式应用程序协调服务,基 ...
- OUT 啦!你的 App 还不支持一键登录吗?
在用户使用 App.网站.产品客户端时,是否对于登陆信息的反复输入感到厌烦? 在用户查看信息.打开问卷.收取资源时,是否因为条条框框输入注册信息而放弃使用? 在企业上新产品,宣传推广,迎接新用户时,是 ...