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

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

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

Я точно знаю, в чем результат. Но как получилось, что все это произошло?

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

Благодаря!

В этом контексте (применяется к ссылке на параметр в определении макроса) знак фунта означает расширение этого параметра до буквального текста аргумента, который был передан макросу.

В этом случае, если вы вызываете 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”

  • Что такое i = (i, ++ i, 1) + 1; делать?
  • Как работает strcmp ()?
  • Самый быстрый способ определить, существует ли целое число между двумя целыми числами (включительно) с известными наборами значений
  • Нечувствительное к строкам сравнение строк C ++
  • Для обновления требуется действительный UpdateCommand при передаче коллекции DataRow с измененными строками
  • Как я могу очистить подписки на события в C #?
  • Пароль Защитите SQLite DB. Является ли это возможным?
  • Могу ли я смешивать статические и общедоступные библиотеки при связывании?
  • Интерфейсы C #. Неявная реализация по сравнению с явной реализацией
  • Как закончить код на C ++
  • Лучшая практика для вызова ConfigureAwait для всего кода на стороне сервера
  • Interesting Posts

    Можно ли ссылаться на другого родителя, кроме одного выше?

    Загружайте файлы и храните их локально с помощью Phonegap / jQuery Mobile Android и iOS Apps

    Место хранения «исчезло» на внутреннем SSD MacBook Air

    Как эффективно диагностировать дросселирование интернет-провайдера (или другие проблемы, связанные с Интернетом) и что с этим делать?

    Какое программное обеспечение доступа (экранные программы) предназначено для окон?

    Сортировка по дате – очень медленно

    Как запустить программу с разрешениями администратора при запуске и свернуть до лотка?

    Windows 8.1 игнорирует его основной язык?

    Как справиться с категориальными особенностями с помощью spark-ml?

    Запустить vcredist_x86.exe отсутствует MSVCR120.dll

    Как обновить / сбросить / сбросить мои записи DNS в Windows?

    Ошибка: шаг «brew link» не завершился успешно

    Как безопасно отправлять пароль через HTTP с помощью Javascript в отсутствие HTTPS?

    Выполнить JSP прямо из Java

    Цитирование через поиск в Bash, где имя файла содержит пробелы

    Давайте будем гением компьютера.