ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【C/C++】宏参数多对一和宏部分替换

2022-03-29 09:32:02  阅读:205  来源: 互联网

标签:__ 一和宏 TU C++ ASSERT cond printf 替换 define


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

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

#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;
}

执行结果:

标签:__,一和宏,TU,C++,ASSERT,cond,printf,替换,define
来源: https://www.cnblogs.com/skullboyer/p/16070183.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有