第1轮_预备_使用C99的可变宏参数实现DEBUG函数

本文介绍了在C99及以上版本中如何利用可变参数宏实现DEBUG日志输出,讲解了C语言中字符串分开写、语句换行、typedef与define的换行规则,以及可变参数函数的特性,包括参数压栈顺序。并提供了最终版本的DEBUG函数及测试方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 需要了解的基础知识

1.1 c里面字符串可以分开写

c语言中,一个字符串可以分开写,比如:

printf("abc" "def" "ghi" "\r\n");
printf("abcdefghi\r\n");

注意:中间不要加“逗号”,加入‘,’ 之后会开始识别参数!
在这里插入图片描述

1.2 语句太长可以用‘\’ 换行写

‘\’的意思是:忽略行尾的换行符。
注 意 \color{red}注意 :只有“ 宏 定 义 \color{red}宏定义 ”和“ 字 符 串 内 部 \color{red}字符串内部 ”的语句换行,才需要加‘\’;
其他地方的语句换行,可以直接敲“回车”!

int main(int argc, char *argv[]){

    printf("abc" "def" 
    "ghi" "\r\n");

    printf("abcde\
fghi\r\n");

    printf("abcde"
    "fghi\r\n");

    return 0;
}

在这里插入图片描述

typedef 可以随意换行

在这里插入图片描述

define 不能随意换行

在这里插入图片描述

#define __DEBUG__

#ifdef __DEBUG__
    #define DEBUG(fmt, ...) printf("[%s, line %d]\r\ndate: %s, time: %s\r\n>>> " fmt "\r\n", \
                                    __FILE__, __LINE__, __DATE__, __TIME__, \
                                    ##__VA_ARGS__)
#else
    #define DEBUG(fmt, ...)
#endif

1.3 C99以上支持可变参数函数

注 意 \color{red}注意 :Keil C51 不 支 持 \color{red}不支持 可变参数函数

所谓的“可变参数”就是函数入参列表可以是任意数量个元素,使用 “…” 表示任意数量个元素,使用 __VA_ARGS__表示这个“参数列表”。

// function prototype
int printf (const char *__format, ...);
// function use
printf("I like num %d, num %d, num%d\r\n", 1, 2, 3);
#define DEBUG(...) printf("parameters %d, %d, %s", __VA_ARGS__)

int main(int argc, char *argv[]){
	DEBUG(12, 12, "hello"); // parameters list is [12, 12, "hello"]

    return 0;
}

在这里插入图片描述

1.4 可变参数决定入参压栈顺序“从右到左”

printf("%d + %d = %d \r\n", 4, 4, 8);

在这里插入图片描述

2. 利用可变参数实现DEBUG日志输出

2.1 最终版本

#define __DEBUG__

#ifdef __DEBUG__
    #define DEBUG(fmt, ...) printf("[%s, line %d]\r\ndate: %s, time: %s\r\n>>> " fmt "\r\n", \
                                    __FILE__, __LINE__, __DATE__, __TIME__, \
                                    ##__VA_ARGS__)
#else
    #define DEBUG(fmt, ...)
#endif

2.2 测试

typedef 
unsigned 
char 
uint8_t;

int main(int argc, char *argv[]){
    uint8_t i = 0;
    for(i = 0; i < 8; i++){
        DEBUG("loop %d", i);
    }

    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值