使用C99的可变宏参数实现DEBUG函数
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;
}