Подтвердить что ты не робот

Что означает #x внутри макроса C?

Например, у меня есть макрос:

#define PRINT(int) printf(#int "%d\n",int)

Я знаю, какой результат. Но как получилось: #int repersent все это?

Я забыл эту деталь. Может кто-нибудь любезно дать мне подсказку?

Спасибо!

4b9b3361

Ответ 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"