2 回答

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
像這樣:
#include <stdio.h>
#define QUOTE(str) #str
#define EXPAND_AND_QUOTE(str) QUOTE(str)
#define TEST thisisatest
#define TESTE EXPAND_AND_QUOTE(TEST)
int main() {
printf(TESTE);
}
原因是當(dāng)將宏參數(shù)替換為宏主體時(shí),除非它們與該宏中的?;?#預(yù)處理運(yùn)算符一起出現(xiàn),否則它們將被擴(kuò)展。因此,str(TEST在代碼中帶有值)不會(huì)在中擴(kuò)展QUOTE,而是會(huì)在中擴(kuò)展EXPAND_AND_QUOTE。

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超13個(gè)贊
為了進(jìn)一步說(shuō)明,基本上使預(yù)處理器執(zhí)行另一個(gè)“階段”。即:
第一種情況:
->TESTE
->QUOTE(TEST) # preprocessor encounters QUOTE
# first so it expands it *without expanding its argument*
# as the '#' symbol is used
->TEST
第二種情況:
->TESTE
->EXPAND_AND_QUOTE(TEST)
->QUOTE(thisisatest)
# after expanding EXPAND_AND_QUOTE
# in the previous line
# the preprocessor checked for more macros
# to expand, it found TEST and expanded it
# to 'thisisatest'
->thisisatest
- 2 回答
- 0 關(guān)注
- 436 瀏覽
添加回答
舉報(bào)