Я знаю, що це тривалий час після оригінального запиту, але це все ще може бути корисним.
Це можна зробити в GCC за допомогою оператора stringify "#", але для цього потрібно два етапи.
#define XSTR(x) STR(x)
#define STR(x) #x
Значення макросу може бути відображено за допомогою:
#pragma message "The value of ABC: " XSTR(ABC)
Див.: 3.4 Структуризація в онлайн-документації gcc.
Як це працює:
Препроцесор розуміє цитовані рядки та обробляє їх відмінно від звичайного тексту. З'єднання струн є прикладом цього спеціального лікування. Прагма повідомлення потребує аргументу, який є цитованим рядком. Якщо в аргументі є більше одного компонента, то всі вони повинні бути рядками, щоб можна було застосувати об'єднання рядків. Препроцесор ніколи не може припустити, що до котирується рядка слід ставитися так, ніби його цитують. Якщо це було тоді:
#define ABC 123
int n = ABC;
не збирався б.
Тепер розглянемо:
#define ABC abc
#pragma message "The value of ABC is: " ABC
що еквівалентно
#pragma message "The value of ABC is: " abc
Це спричиняє попередження попереднього процесу, оскільки abc (без котирування) не може бути з'єднано з попереднім рядком.
Тепер розглянемо попередню послідовність препроцесорів (Що колись називалося стрифікацією, посилання в документації були змінені, щоб відображати переглянуту термінологію. (Обидва умови, до речі, однаково виявляються обережними. Правильний термін - це, звичайно, строфіфікація). ваші посилання.)) оператор. Це діє лише на аргументи макросу і замінює нерозширений аргумент аргументом, укладеним у подвійні лапки. Таким чином:
#define STR(x) #x
char *s1 = "abc";
char *s2 = STR(abc);
присвоїть однакові значення s1 і s2. Якщо ви запускаєте gcc -E, ви можете бачити це у висновку. Можливо, STR краще буде назвати щось на кшталт ENQUOTE.
Це вирішує проблему розміщення лапок навколо котируваного елемента, тепер проблема полягає в тому, що якщо аргумент є макросом, макрос не буде розширено. Саме тому потрібен другий макрос. XSTR розширює свій аргумент, потім викликає STR, щоб розмістити розширене значення в лапки.