LOG宏一般处理,没有参数,只有字符串参数,字符串格式和一个参数,多个参数的场合。以下是针对常见的应用场合举例说明,可便参数的使用。
代码
#include <stdio.h>#define LOG(format, ...) printf("[%s][%d]" format "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)int main() {LOG();LOG("abc");LOG("abc %d", 10);LOG("abc %d %s", 10, "efg");return 0;
}
预编译
renhl252@renhl:~/usb/c$ gcc main.c -E -o main.i
预编译结果
# 5 "main.c"
int main() {printf("[%s][%d]" "\n", __FUNCTION__, 6);printf("[%s][%d]" "abc" "\n", __FUNCTION__, 7);printf("[%s][%d]" "abc %d" "\n", __FUNCTION__, 8, 10);printf("[%s][%d]" "abc %d %s" "\n", __FUNCTION__, 9, 10, "efg");return 0;
}
预编译结果解析
调用形式 | format 字符串 | 可变参数 | 展开后的 printf 调用 |
---|---|---|---|
LOG(); | printf("[%s][%d]\n", __FUNCTION__, __LINE__); | ||
LOG("abc"); | "abc" | 无 | printf("[%s][%d]abc\n", __FUNCTION__, __LINE__); |
LOG("abc %d", 10); | "abc %d" | 10 | printf("[%s][%d]abc %d\n", __FUNCTION__, __LINE__, 10); |
LOG("abc %d %s", 10, "efg"); | "abc %d %s" | 10 , "efg" | printf("[%s][%d]abc %d %s\n", __FUNCTION__, __LINE__, 10, "efg"); |
- 可变参数处理:
##
是预处理器的连接符,其作用是在可变参数为空时去除多余的逗号,从而避免出现编译错误。
编译
renhl252@renhl:~/usb/c$ gcc main.c
测试结果
renhl252@renhl:~/usb/c$ ./a.out
[main][6]
[main][7]abc
[main][8]abc 10
[main][9]abc 10 efg
renhl252@renhl:~/usb/c$