细数linux内核里那些偏门的C语言语法(二)x... 与 #x
2017-06-17 18:38
225 查看
同样是在跟linux内核源码的时候,看到这样的宏定义
#define __stringify_1(x...) #x
#define __stringify(x...) __stringify_1(x)
x...是什么意思呢? #x又是什么意思?
#x是将x转换成字符串。
比如下面代码
printf(__stringify_1(hello) );
输出结果为 hello
那么x...又是什么意思呢?
表示支持其他符合输入。
比如
#define TOSTRING(x) #x
printf(TOSTRING(hello, kk) );
编译报错
加上...后
#define TOSTRING(x...) #x
printf(TOSTRING(hello, kk) );
编译通过
输出结果为
hello, kk
x...有一个用法
以前我的DEBUG错误打印宏是这样定义的
#define DEBUG_ERR(buf) printf("Error:"buf)
#define DEBUG_ERR_ARG(buf, ...) printf("Error:"buf, __VA_ARGS__)
将带参数和不带参数的分开,不然编译会报错
知道这个用法之后只需要一个函数搞定
#define DEBUG_ERR(buf...) printf("Error:"buf)
这样带没带参数都可以了
#define DEBUG_ERR(buf...) printf("Error: "buf)
int main()
{
int len = 100;
DEBUG_ERR("len is out of range , len = %d\n", len);
return 0;
}
输出结果为
Error: len is out of range , len = 100
相关文章推荐
- 细数linux内核里那些偏门的C语言语法(一)简化三目运算
- 细数linux内核里那些偏门的C语言语法(三) !!(x)
- 细数linux内核里那些偏门的C语言语法(四)(unsigned long)-MAX_ERRNO
- Linux Shell语法速查表(用C语言语法来作对比)
- C语言一些少见但很有用的语法
- 读懂严蔚敏C语言数据结构需要弄清楚的N个C语言语法
- 黑马程序员_ios基础总结2_C语言基本语法一
- C语言字符串的常见特殊操作(除了string.c实现的那些接口)
- C语言-基本语法教程
- 看看C# 6.0中那些语法糖都干了些什么(终结篇)
- 【黑马程序员】Objective-C语言学习笔记之核心语法(四)
- C语言 点语法的总结
- 重新学习C语言——关于printf 和scanf语法和语句
- C语言的那些秘密之---函数返回局部变量
- C语言中的那些运算符
- C语言的那些小秘密之堆栈
- C语言的那些小秘密之指针(二)
- C语言的那些小秘密之断言
- C语言的那些小秘密——异常处理(转bigloomy)
- C语言的那些小秘密——断言