#、##和__VA_ARGS__
来源:互联网 发布:pc端支付功能js的开发 编辑:程序博客网 时间:2024/04/29 22:41
1.#
假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化成字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化。
the square of y is 16.
the square of 2+4 is 36.
#define XNAME(n) x##n
这样宏调用:
XNAME(4)
展开后:
x4
程序:
实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,替换省略号所代表的字符串。比如:
hello
weight = 1, shipping = 2
省略号只能代替最后面的宏参数。
假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化成字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化。
#incldue <stdio.h>#define PSQR(x) printf("the square of #x is %d.\n", (x)*(x))int main(void){ int y =4; PSQR(y); PSQR(2+4); return 0;}输出结果:
the square of y is 16.
the square of 2+4 is 36.
第一次调用宏时使用“y”代替#x;第二次调用时用“2+4"代#x。
OtherCode eg.
#define ASSERT(e) ((e) ? (void)0 : <span style="color:#ff0000;">x_assert</span>(#e, __FILE__, __LINE__))... ...void <span style="color:#ff0000;">x_assert</span>(const char * msg, const char * filename, int line){ ... ...};
2.##
##运算符可以用于类函数宏的替换部分。另外,##还可以用于类对象宏的替换部分。这个运算符把两个语言符号组合成单个语言符号。例如:#define XNAME(n) x##n
这样宏调用:
XNAME(4)
展开后:
x4
程序:
#include <stdio.h>#define XNAME(n) x##n#define PXN(n) printf("x"#n" = %d\n",x##n)int main(void){ int XNAME(1)=12;//int x1=12; PXN(1);//printf("x1 = %d\n", x1); return 0;}输出结果:
x1=12
3.可变参数宏...和_ _VA_ARGS_ _
__VA_ARGS__ 是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,替换省略号所代表的字符串。比如:
#define PR(...) printf(__VA_ARGS__)int main(){ int wt=1,sp=2; PR("hello\n"); PR("weight = %d, shipping = %d",wt,sp); return 0;}输出结果:
hello
weight = 1, shipping = 2
省略号只能代替最后面的宏参数。
#define W(x,...,y)错误!
参考:
[1]. http://blog.csdn.net/jinzhilong580231/article/details/8774259
1 0
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- #、##和__VA_ARGS__
- 最小二乘法 来龙去脉
- LeetCode-329.Longest Increasing Path in a Matrix
- 15.1 迭代器
- 我的学习之路
- Maven-Tomcat部署
- #、##和__VA_ARGS__
- 函数指针的正确理解 from C++ Primer Plus P242
- 设计模式2之策略模式
- 用java花一棵树(Applet)转
- UISwitch的使用
- 剑指Offer----面试题22:栈的压入、弹出序列
- 15.2 登录 注册
- “鼠标拖动游戏窗口,消息循环会卡住,导致游戏不能更新不能渲染”,解决办法在这里
- /etc/rc.d/init.d/ssh