Что означает #x внутри макроса C?
Например, у меня есть макрос:
#define PRINT(int) printf(#int "%d\n",int)
Я знаю, какой результат.
Но как получилось: #int repersent все это?
Я забыл эту деталь. Может кто-нибудь любезно дать мне подсказку?
Спасибо!
Ответы
Ответ 1
В этом контексте (применяется к ссылке на параметр в определении макроса) знак фунта означает развернуть этот параметр до буквального текста аргумента, который был передан макросу.
В этом случае, если вы вызываете PRINT(5)
, расширение макроса будет printf("5" "%d\n", 5);
, которое будет печатать 5 5
; не очень полезно; однако, если вы вызываете PRINT(5+5)
, расширение макроса будет printf("5+5" "%d\n", 5+5);
, которое напечатает 5+5 10
, немного менее тривиально.
Этот пример объясняется в этом руководстве по препроцессору C (который, кстати, является первым хитом Google для c знак макрофунта).
Ответ 2
"#" может отображать имя переменной, лучше определить макрос следующим образом:
#define PRINT(i) printf(#i "= %d\n", i)
и используйте его следующим образом:
int i = 5;
PRINT(i);
Показанный результат:
i = 5
Ответ 3
Это плохой выбор имени для макропараметра, но безвредный (спасибо dreamlax).
В принципе, если я пишу так
PRINT(5);
Он будет заменен как
printf("5" "%d\n",5);
или
printf("5 %d\n",5);
Это процесс, называемый Stringification, #int заменяется строкой, состоящей из ее содержимого, 5 → "5"