[问题] macro替换字符

楼主: ManOfSteel (Man Of Steel)   2021-07-25 04:35:49
Hi 我想请问一下
(1)
#define B(z) #z
char *string=B(HELLO);
void main()
{
printf("%s\n",string);
}
因为根据
C primer plus的说法,会形成有双引号的HELLO,展开如下:
char *string="HELLO"。
萤幕显示结果:HELLO
可是C primer plus有一个范例如下:
(2)
#define PSQR(x) printf("The square of " #x " ")
void main()
{
PSQRY(y);
}
萤幕显示结果:The square of y
问题:
#x 旁为啥会多一组双引号,形成" #x "。
如果不加双引号,结果就会是:
The square of #x
为什么呢?
作者: LPH66 (-6.2598534e+18f)   2021-07-25 06:44:00
这里用的是 C/C++ 里当 string literal 并排时会合并的语法例如你写 "A" "B" "C" 和你写 "ABC" 是一样的意思那这里会是 "The square of " "y" " " 并排其中 #x 如你所理解的变成了一个 string literal然后套用这个合并语法就变成 "The square of y " 了因此这里并不是 #x 外面多一组引号而是一个 string literal, 跟着 #x, 再跟着另一个 literal
作者: chuegou (chuegou)   2021-07-25 14:03:00
#被““包住 预处理时看不到吧
作者: LPH66 (-6.2598534e+18f)   2021-07-25 14:51:00
对, 就单纯是 macro 不会代换 string literal 里的东西个人认为这个 string literal 并排规则其实就是解决这问题才发展出来的语法...string literal 里的字编译器除了会转译跳脱序列外只会照搬这样写的人也不用担心我写的字串突然变了那所以要代换 string literal 就需要一个在 "" 外的东西这就是并排规则出场的时候了
作者: fatrabitree (胖兔子)   2021-07-26 01:11:00
MACRO 不是MACO

Links booklink

Contact Us: admin [ a t ] ucptt.com