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

2022/3/29 11:26:22

本文主要是介绍【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++】宏参数多对一和宏部分替换的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程