一、可变参数宏
可变参数宏是C语言与C++语言的函数宏的参数个数可以是0个或多个。
声明语法:逗号后面三个句点’’…",表示一个参数或多个参数。宏扩展时,使用特殊标识符__VA_ARGS__来替换所传递的参数。如果可变参数为空,在__VA_ARGS__前面加上##直接自动去掉可变参数前的逗号,否则编译报错。
#define debug(format,...) printf(format, ##__VA_ARGS__)
//等效于
#define debug(format,args...) printf(format, ##args)
两种声明作用完全相同,根据易读性选择。
二、源码
/*************************************************************
* @brief : printf debug
* @file : debug.h
* @author : 萌哒兽
* @date : 2020-09-16(更新)
*************************************************************/
#ifndef __DEBUG_H
#define __DEBUG_H
#define LOG_NONE 0 //无log
#define LOG_ERROR 1 //显示错误以上log
#define LOG_WARNING 2 //显示警告以上log
#define LOG_INFO 3 //显示提示以上log
#define LOG_VERBOSE 4 //显示所有log
#define LOG_LEVEL LOG_VERBOSE //设定Log等级
#define __BR "\r\n" //换行符
#if (LOG_LEVEL>=LOG_ERROR)
#define log_e(format, ...) printf("E:"format __BR, ##__VA_ARGS__)
#else
#define log_e(format, ...)
#endif
#if (LOG_LEVEL>=LOG_WARNING)
#define log_w(format, ...) printf("W:"format __BR, ##__VA_ARGS__)
#else
#define log_w(format, ...)
#endif
#if (LOG_LEVEL>=LOG_INFO)
#define log_i(format, ...) printf("I:"format __BR, ##__VA_ARGS__)
#else
#define log_i(format, ...)
#endif
#if (LOG_LEVEL>=LOG_VERBOSE)
#define log_v(format, ...) printf("V:"format __BR, ##__VA_ARGS__)
#else
#define log_v(format, ...)
#endif
#endif
三、测试
测试代码;
/*************************************************************
* @brief : printf debug test
* @file : main.c
* @author : 萌哒兽
* @date : 2020-09-16(更新)
*************************************************************/
#include <stdio.h>
#include "debug.h"
int main(void)
{
log_e("ERROR debug test.");
log_w("WARNING debug test.");
log_i("INFO debug test");
log_v("VERBOSE debug test.");
return 1;
}
测试输出:
[Running] cd "fangjijun:\design\test\User\" && gcc debug.c -o debug && "fangjijun:\design\test\User\"debug
E:ERROR debug test.
W:WARNING debug test.
I:INFO debug test
V:VERBOSE debug test.
[Done] exited with code=0 in 0.275 seconds