变参宏、宏“套”宏 宏的初级理解

"##"运算符–预处理黏合剂

与’#'类似 ##运算符 可用于类宏函数的替换部分
并且 ## 还可以用于对象宏的替换部分. ##运算符把两个记号组合成一个记号

例如 #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
//不能这么做//

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值