c语言,用 ANSI “字符串化” 预处理操作符 # 向信息中插入符号

yandong 发布于 2012/08/07 17:12
阅读 518
收藏 0
11.18
我试图用 ANSI “字符串化” 预处理操作符 # 向信息中插入符号
常量的值, 但它字符串化的总是宏的名字而不是它的值。
你可以用下面这样的两步方法迫使宏既字符串化又扩展:
#define Str(x) #x
#define Xstr(x) Str(x)
#define OP plus
char *opname = Xstr(OP);


这段代码把 opname 置为 “plus” 而不是 “OP”。
在使用符号粘接操作符 ## 连接两个宏的值 (而不是名字) 时也要采用同样的
“迂回战术”。

为什么要采用这种方式,谁能解释其中原理呢?????????
加载中
0
永远在一起

C语言规定,#和##的操作数,不进行第二次展开。也就是说如下代码

#define Str(x) #x
#define OP plus
const char* p = Str (OP);

第一次展开Str时:

const char* p = Str(OP);

变成

const char *p = #OP ;

由于OP是#的操作数,所以OP不进行第二次展开。

const char *p = "OP";

为什么这样子?考虑会展开OP的情况,如果#操作符会展开操作数,这里的OP是一个宏,我们怎么通过#操作符得到"OP",这个字符串呢??很明显,办不到,因为如果要通过#操作符得到"OP"这个字符串,那么OP必然是#的操作数,由于要求展开OP,所以OP必然会展开成为plus。标准这样子规定,可以保证提供两个功能,一个保证展开宏,一个保证得到的就是#操作数的字符串。

yandong
yandong
了解了,好复杂,以后还是少用吧
0
中山野鬼
中山野鬼

引用来自“永远在一起”的答案

C语言规定,#和##的操作数,不进行第二次展开。也就是说如下代码

#define Str(x) #x
#define OP plus
const char* p = Str (OP);

第一次展开Str时:

const char* p = Str(OP);

变成

const char *p = #OP ;

由于OP是#的操作数,所以OP不进行第二次展开。

const char *p = "OP";

为什么这样子?考虑会展开OP的情况,如果#操作符会展开操作数,这里的OP是一个宏,我们怎么通过#操作符得到"OP",这个字符串呢??很明显,办不到,因为如果要通过#操作符得到"OP"这个字符串,那么OP必然是#的操作数,由于要求展开OP,所以OP必然会展开成为plus。标准这样子规定,可以保证提供两个功能,一个保证展开宏,一个保证得到的就是#操作数的字符串。

楼上,下面这个有点问题。哈。

const char *p = "OP";
中山野鬼
中山野鬼
回复 @永远在一起 : 哦。。哈。是我看错了。。。
永远在一起
什么问题???
返回顶部
顶部