define 中的#,##和#@

    今天逛CU论坛的时候看见有人问#define GLRO(x) _##x是什么意思。这个问题我曾经在一次笔试中遇

过,当时也花了一些时间在网上查了一下,也有了点心得,所以今天想写一篇相关的文章,希望以后能给

需要用在到这个知识点的人点帮助。
    总的来说,在网上搜索得到的知识中,在宏中使用#有3种情况,下面我们分情况来讨论一下吧。
    1) 前加##或后加##,将标记作为一个合法的标识符的一部分.注意,不一定只能是字符串的。这种

方式多用于多行的宏定义中.例如:
#define F(x)  T_##x则 int F(1) = 10;等效于int T_1 = 10;
#define F(x)  Tx##_则 int F(1) = 10; 等效于int T1_ = 10;
    如果一个标识符的两端相同,但是中间不一样时,比如数组,我们也可以用##来帮助我们减少工作量

的。其用法是如果要连接x前面部分,则##要加在x前面,如果要接后面部分,则要加在x后面。例如
#define F(x) A[##x##]则 int F(1) = 10;等效于int A[1] = 10;
    当然,我们不鼓励这样给数组赋值,毕竟这样做可能会导致代码的可读性变差的。

    2)前加#,将参数替换为字符串.
#define C(x) #x 则C(1+1) 即 "1+1" ,C(ABC)就是"ABC" ,C(a)就代表"a"

    3) 前加#@,将标记转换为相应的字符,注意:仅对参数中最后的单一标记转换有效
#define B(x) #@x 则B(a)即'a',B(1)即'1'.但B(abc)是c.

    其实上面的3种情况中,只有1和2两种情况是我通过测试的(我的编译环境是DEV C++),情况3在编

译错误的。也许在其他编译环境中能够成功使用。这就要读者自己去试了。
    下面给一个我自己学习时候写的例子给大家,希望有用吧。
//header
#include <stdio.h>
#include <stdlib.h>

//macro
#define  PRINT(x) printf(#x);printf("/n")
#define GLRO1(x) _##x
#define GLRO2(x) x##_p
#define GLRO3(x) p##x##_p

//main
int main(){
 //_##x
 char *_a="hello";
 char *_b="world";
 //x##
 char *a_p="hello";
 char *b_p="world";
 //p##x##_p
 char *pa_p="hello";
 char *pb_p="world";

 //case 1
 printf("%s %s/n",GLRO1(a),GLRO1(b));
 printf("%s %s/n",GLRO2(a),GLRO2(b));
 printf("%s %s/n",GLRO3(a),GLRO3(b));
 //case 2
 PRINT(hello world);

 

 system("pause");
 return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值