[問題] 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