预编知识
printf 中的
可以把printf 中的 ##
理解成是一个粘合剂。
这个运算符把两个语言符号组合成单个语言符号,为宏扩展提供了一种连接实际变元的手段。
例如
#define XNAME(n) x##n
如果这样使用宏:XNAME(8)
则会被展开成这样:x8
printf 中的 … 与 __VA_ARGS__
...
表示 输入的参数不定,__VA_ARGS__
是一个可变参数的宏。
#define print1(...) printf(__VA_ARGS__);
,...
将参数传递给宏__VA_ARGS__
- … 与 args… 的区别
错误信息打印模板
方式一
#define MODULE_NAME "module1"
#define msg_error(fmt,...) printf("ERROR!["MODULE_NAME"],(%s|%d) "fmt,__func__,__LINE__,##__VA_ARGS__)
方式二
#define MODULE_NAME "module1"
#define msg_error(...) \
{ \
printf("ERROR ",MODULE_NAME, __func__, __LINE__); \
printf(__VA_ARGS__); \
}
多层级
#define TAG "MCUART"
#define msg_error(fmt,...) OSI_LOGI("["TAG",%s|%d]"fmt,__func__,__LINE__,##__VA_ARGS__)
#define OSI_LOGI(fmt, ...) printf(fmt, ##__VA_ARGS__);