宏定义中的#、##和#@符号

1、# 字符串化操作符
   其作用是:将宏定义中的传入参数名转换成用一对双引号括起来的参数名字符串。
   其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。
   如:
        #define TEST_MACRO1(para) printf("Welcome to the C world, %s!\n", #para)
   当使用该宏定义时:
        TEST_MACRO1(ligt);
        在编译时将会展开成:printf("Welcome to the C world, %s!\n", "ligt");
   注意(对空格的处理):
        (1)忽略传入参数名前面和后面的空格,如:
             TEST_MACRO1(  ligt  );也会被展开成:printf("Welcome to the C world, %s!\n", "ligt");
        (2)当传入参数名间存在空格时,编译器将会自动连接各个子字符串,并以一个空格连接各个子字符串,
             忽略其中多余的空格,如:
             TEST_MACRO1(  know   pig   xia   );被展开成:printf("Welcome to the C world, %s!\n", "know pig xia");

2、## 符号连接操作符
   宏定义中,参数名即为形参,如:#define sum(a, b) ((a) + (b))
   其中a和b均为某一参数的代表符号,即形式参数。而##的作用则是将宏定义中的多个形参组成一个实际参数名。
   如:
        char *username1 = "ligt";
        #define TEST_MACRO2(para) printf("Welcome to the C world, %s!\n", username##para)
   当使用该宏定义时:
        TEST_MACRO2(1);
        在编译时将会展开成:printf("Welcome to the C world, %s!\n", username1);
   注意:
        (1)当用##连接形参时,##前后的空格可有可无。
        (2)连接后的实际参数名,必须为实际存在的参数名或是编译器已知的宏定义。

3、#@ 字符化操作符
   只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。作用是将传的单字符参数名转化成字符,
   以一对单引号括起来。如:
        #define MAKECHAR(x)
#@x
        char ch = MAKECHAR(a);
        展开后变成:char ch = 'a';
    注意:
        该操作符用gcc、g++编译时都报错,应该是不支持,但在vc 6.0上编译运行都没有问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值