今天逛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;
}