宏参数多对一:使用分号分隔多参数

宏部分替换:替换需要转换的再与后续宏接续

#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++】宏参数多对一和宏部分替换的更多相关文章

  1. C/C++语言中#的神奇作用:把宏参数字符串化/贴合宏参数

    宏中"#"和"##"的用法 一.一般用法   我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. #define STR(s)      #s # ...

  2. 宏参数(Arguments)的扩展

    宏分为两种,一种是 object-like 宏,比如: #define STR "Hello, World!" 另一种是 function-like 宏,比如: #define M ...

  3. C语言不支持默认参数,不过可以用宏来模拟

    C语言不支持默认参数,不过可以用宏来模拟: //--------------------------------------------------------------------------- ...

  4. C/C++中 # 的神奇作用:把宏参数字符串化/贴合宏参数

    一.一般用法   我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. #define STR(s) #s #define CONS(a,b) int(a##e##b) printf(ST ...

  5. Confluence 6.15 博客页面(Blog Posts)宏参数

    参数是让你可以用来控制宏的格式和输出的选项.在 Confluence 存储格式或者 Wiki 标记(wikimarkup)中使用的参数名与在宏浏览器中使用的标签名是不同的,在下面我们将会用括号列出  ...

  6. C语言之带有数量可变的宏参数#define

    1.定义格式如下 #define PR(...)  printf(__VA_ARGS__) ...表示可变参数,__VA_ARGS__的作用是替换省略号的内容. 2.示例 #define ERROR( ...

  7. C语言:宏参数的字符串化和宏参数的连接

    在宏定义中,有时还会用到#和##两个符号,它们能够对宏参数进行操作. # 的用法 #用来将宏参数转换为字符串,也就是在宏参数的开头和末尾添加引号.例如有如下宏定义: #define STR(s) #s ...

  8. macro-name replacement-text 宏 调试开关可以使用一个宏来实现

    C++ 预处理器_w3cschool https://www.w3cschool.cn/cpp/cpp-preprocessor.html C++ 预处理器 预处理器是一些指令,指示编译器在实际编译之 ...

  9. 宏定义(无参宏定义和带参宏定义),C语言宏定义详解

    1.宏定义说明 宏定义是比较常用的预处理指令,即使用"标识符"来表示"替换列表"中的内容.标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏 ...

  10. macro-name replacement-text 宏 调试开关可以使用一个宏来实现 do { } while(0)

    C++ 预处理器_w3cschool https://www.w3cschool.cn/cpp/cpp-preprocessor.html C++ 预处理器 预处理器是一些指令,指示编译器在实际编译之 ...

随机推荐

  1. rcs群发软件系统功能设计与应用,rcs群发软件系统,rcs群发软件

    随着科技的不断发展,人们对于通讯方式的需求也在不断变化,传统的短信.电话已经无法满足人们对于高效.便捷.实时的通讯需求,正是在这样的背景下,富通讯解决方案(Rich Communication Sui ...

  2. Typora远程代码执行漏洞 - CVE-2023-2317

    Typora - CVE-2023-2317 简介 Typora一个常用的markdown编辑器,在1.6.7之前存在XSS漏洞,可以通过传入参数触发来加载恶意的JavaScript代码 分析 在ty ...

  3. 初探Git:理解和使用版本控制的魔法

    遥远的古代,有一位美丽的仙女叫做嫦娥.她的丈夫后羿获得了令人长生不老的鹿骨露.一天,嫦娥在好奇心的驱使下,独自偷喝了这瓶仙药. 喝下仙药的瞬间,嫦娥发现自己开始飘起,越飘越高,最后飘向了月亮.嫦娥惊慌 ...

  4. CodeForces 1307D BFS最短路 思维

    原题链接 题意 给出一个简单无向图,边权全部为1,同时给我们k个特殊点,要求我们从这k个特殊点中选出两个来连一条边权为1的边.同时,我们的决策要保证1~n的最短路程最大,求最终这个最短路长度. 思路 ...

  5. 云图说|分钟级构建业务大屏——Astro大屏应用

    本文分享自华为云社区<[云图说]第271期 Astro Canvas一站式数据可视化开发,分钟级构建业务大屏>,作者:阅识风云 . Astro大屏应用(Astro Canvas)是Astr ...

  6. 【API进阶之路】因为不会创建云服务器,我被实习生摆了一道

    摘要:9个步骤通过API创建云服务器. 事情是这样的,公司成立了一个新项目,要给项目建官网,并搭建一个web服务器.按照我的习惯,搭建一个本地虚拟机就好了,部署简单方便还好配置,云服务器嘛,写了10年 ...

  7. 2种GaussDB(DWS)查看作业运行信息方式

    摘要:提供以作业基本单位的作业统计视图pgxc_session_wlmstat,便于用户观察运行作业和排队作业信息. 本文分享自华为云社区<GaussDB(DWS)如何查看作业运行信息>, ...

  8. 18篇文章系统解读:中台规划如何撬动企业IT基础设施转型升级

    摘要:通过这个系列,让大家对中台的价值.针对的问题痛点.中台规划的方法思路和技巧.一些中台业务实践有个基本的认识,让客户清楚的意识到企业中台的业务价值,进而通过企业中台规划牵引客户IT基础设施投资. ...

  9. 华为云PB级数据库GaussDB(for Redis)揭秘第九期:与HBase的对比

    摘要: 高斯Redis,兼具开源Redis和HBase各自优点,提供成本更低.性能更好.灵活性更强的数据库服务! 本文分享自华为云社区<华为云PB级数据库GaussDB(for Redis)揭秘 ...

  10. 想要做好软件测试,可以先了解AST、SCA和渗透测试

    摘要:如何做好安全测试,我们重点从应用程序安全测试AST.软件组成分析SCA和渗透测试三个方面来看一下. 本文分享自华为云社区<DevSecOps研发安全实践--测试篇>,作者:华为云Pa ...