C/C++ 宏的高级使用1.0

  1. 单个#

引例1.

#include<stdio.h>

#define P(x) printf("%s=%d\n",#x,x)
int main(){
    /*  #x 的作用就是把x转成"x",转成字符串*/ 
    int a1=10,a2=20,a3=30;
    P(a1);  // 打印  a1=10 
    P(a2);  // 打印  a2=20 
    P(a3);  // 打印  a3=30 
    return 0;
}

引例2

#include<stdio.h>

#define printFUN(x) printf("%s",#x)
void  gogogo()  /* 在函数里面打印函数名 */ 
{

    //printf("%s",gogogo);  //打印出乱码  
    printFUN(gogogo);     // 打印出 "gogogo" 
}
int main(){
    //函数名只是函数地址
    gogogo();
    return 0;
}

2.两个 ##
引例1

#include<stdio.h>

#define PP(x) printf##x
void printf1(){
    printf("1111\n");
}
void printf2(){
    printf("2222\n");
}
void printf3(){
    printf("3333\n");
}
int main(){
    //  ## 相当于把 printf 和 x 连接成printfx 
    PP(1)();  // PP(1) 等价于 printf1
              // PP(1)()等价于 printf1() 
    PP(2)();
    PP(3)();
    return 0;
}

引例2

#include<stdio.h>

#define P(x) printf("%s=%d\n",#x,x)
#define I(x) I##x
int main(){
    int I(1)=11,I(2)=22,I(3)=33;  
    I1=100;  //I1 等价于 I(1),I(1)值也改变 
    I2=200;    
    I3=300;
    P(I(1));  // 打印出  I(1)=100 
    P(I(2));  // 打印出  I(2)=200
    P(I(3));  // 打印出  I(3)=300 
    return 0;
}

3.宏变量
宏变量主要有
__FILE__ :宏在预编译时会替换成 当前程序的文件名
__LINE__ :宏在预编译时会替换成 当前行数
__FUNCTION__:宏在预编译时会替换成 当前的函数名称

#include<stdio.h>
#include<stdlib.h>


void sss(){
    printf("Function:%s\n",__FUNCTION__);  //打印结果为 "sss" 
}
int main(){
    //myprintf(); 
    printf("Function:%s\n",__FUNCTION__);
    sss();
    printf("File:%s\n",__FILE__);
    printf("Line:%d\n",__LINE__);
    return 0;
}

打印的结果

Function:main
Function:sss
File:E:\Code2017\test2.cpp
Line:13

4.__VA_ARGS__ 可变参数宏

#include<stdio.h>

#define myprint(fm,...)  printf(fm,__VA_ARGS__)
int main(){
    int a=10;
    myprint("hello %d\n",a); 
    //但是如果没有参数的话, 会报错,如下 
    //myprint("hello ");
    return 0; 
}

这里,如果可变参数被忽略或为空,’##’操作将使预处理器(preprocessor)去除掉它前面的那个逗号
因此应该改为

#include<stdio.h>

#define myprint(fm,...)  printf(fm,##__VA_ARGS__)  //加上##
int main(){
    //int a=10;
    myprint("hello \n"); 

    return 0; 
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值