宏
"##"运算符–预处理黏合剂
与’#'类似 ##运算符 可用于类宏函数的替换部分
并且 ## 还可以用于对象宏的替换部分. ##运算符把两个记号组合成一个记号
例如 #define XNAME(n) x ## n
#define XNAME(n) x ## n
int main() {
/* --------------------------------*/
long long XNAME(1);//longlong x1;
long XNAME(2);//long x2;
double XNAME(3); //double x3;
int XNAME(4) = 123;// int x4 = 123;
/*----------------------------------*/
}
在上文中 XNAME(n) 在于编译阶段被转换为 名为 *x’n’*的变量
同理
#define PRINF_XN(n) printf("x" #n " = %d\n",x ## n);
int main()
{
PRINF_XN(1);//printf("x1"= %d\n",x1);
PRINF_XN(2);//printf("x2 = %d\n",x2);
PRINF_XN(3);//printf("x3 = %d\n",x3);
/*--------------------------------*/
}
#define PRINF_XN(n) printf(“x " #n " = %d\n”,x ## n);
在#define定义的文本中 若要将printf(“x " #n " = %d\n”,x ## n); 中的
#n 替换成程序员定义的’n’
需要这在代码中应以 “#n” 的形式定义 ___/两端加上双引号/___
变参宏: … 和 __ VA_ARGS __
代码形式: #define PR(…) printf( __VA_ARGS__)
* 假设稍后调用宏
PF("asdf");
PF("asdf = %d\n,shipping $%.2f\n",wt,sp );
* 编译后实现如下
1. printf("asdf");
2. printf("asdf = %d\n,shipping $%.2f\n",wt,sp );
同理 也可这么定义
#define PR(X , ... ) printf( "Message "#X " : "__VA_ARGS\_\_);
调用则为
PR(1,"x = %g\n" ,x);
在编译器预处理后则变为
printf("Message 1: x = %g\n",x);
在上文中的 #X 是 1;
__VA_ARGS__ 是 "x = %g\n" ,x
经过编译器拼接后 变为最终的语句
! : warning
省略号只能替换做后的宏参数
#define WRONG( X , … , Y ) #X #__VA_ARGS__ #Y
//不能这么做//