Что означает #x внутри макроса C?
Например, у меня есть макрос:
#define PRINT(int) printf(#int "%d\n",int)
Я точно знаю, в чем результат. Но как получилось, что все это произошло?
Я забыл эту деталь. Может кто-нибудь любезно дать мне подсказку?
- ServiceStack.Net Redis: сохранение связанных объектов и связанных с ними идентификаторов объектов
- Есть ли какой-либо реальный риск для получения из контейнеров STL C ++?
- Избегание сообщений об исключении из первой случайности, когда исключение безопасно обрабатывается
- Чистый индекс Eclipse, он не синхронизирован с кодом
- JWT на .NET Core 2.0
Благодаря!
- Как проверить, закрыто ли соединение TcpClient?
- ASP.Net URLEncode Амперсанд для использования в Query String
- Печать из службы .NET
- Почему чистая виртуальная функция инициализируется 0?
- максимальное значение целого числа
- Fancybox - кнопка ASP.NET не работает
- В чем смысл * и & применимо к именам переменных?
- Что стандартная библиотека гарантирует самопереключение?
В этом контексте (применяется к ссылке на параметр в определении макроса) знак фунта означает расширение этого параметра до буквального текста аргумента, который был передан макросу.
В этом случае, если вы вызываете 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-знака с макрофунтом ).
«#» может отображать имя переменной, лучше определить макрос следующим образом:
#define PRINT(i) printf(#i "= %d\n", i)
и используйте его так:
int i = 5; PRINT(i);
Результат:
i = 5
Это плохой выбор имени для макропараметра, но безвредный (спасибо dreamlax).
В принципе, если я пишу так
PRINT(5);
Он будет заменен как
printf("5" "%d\n",5);
или
printf("5 %d\n",5);
Это процесс под названием Stringification , #int заменяется строкой, состоящей из ее содержимого, 5 -> “5”