Я знаю, что прошло много времени после исходного запроса, но это все еще может быть полезно.
Это можно сделать в GCC с помощью оператора строкового преобразования "#", но это требует двух этапов.
#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 (без кавычек) не может быть объединено с предыдущей строкой.
Теперь рассмотрим преобразование препроцессора в строку (которое когда-то называлось преобразованием в строку, ссылки в документации были изменены, чтобы отразить пересмотренную терминологию. (Оба термина, кстати, одинаково отвратительны. Правильный термин, конечно, stringifaction. Будьте готовы обновить ваши ссылки.)) оператор. Это действует только на аргументы макроса и заменяет нерасширенный аргумент аргументом, заключенным в двойные кавычки. Таким образом:
#define STR(x) #x
char *s1 = "abc";
char *s2 = STR(abc);
присвоит одинаковые значения s1 и s2. Если вы запустите gcc -E, вы увидите это на выходе. Возможно, STR лучше было бы назвать как-то вроде ENQUOTE.
Это решает проблему помещения в кавычки элемента, не заключенного в кавычки, проблема в том, что, если аргумент является макросом, макрос не будет расширен. Вот почему нужен второй макрос. XSTR расширяет свой аргумент, затем вызывает STR, чтобы поместить расширенное значение в кавычки.