Wiem, że minęło dużo czasu od pierwotnego zapytania, ale może to być przydatne.
Można to zrobić w GCC za pomocą operatora stringify „#”, ale wymaga to dwóch etapów.
#define XSTR(x) STR(x)
#define STR(x) #x
Wartość makra można następnie wyświetlić za pomocą:
#pragma message "The value of ABC: " XSTR(ABC)
Zobacz: 3.4 Stringifikacja w dokumentacji online gcc.
Jak to działa:
Preprocesor rozumie cytowane ciągi i traktuje je inaczej niż zwykły tekst. Przykładem tego specjalnego traktowania jest konkatenacja ciągów. Komunikat pragma wymaga argumentu będącego łańcuchem cudzysłowu. Jeśli argument zawiera więcej niż jeden składnik, wszystkie muszą być łańcuchami, aby można było zastosować konkatenację ciągów. Preprocesor nigdy nie może założyć, że niecytowany ciąg powinien być traktowany tak, jakby był cytowany. Jeśli tak się stało:
#define ABC 123
int n = ABC;
nie będzie się kompilować.
Rozważmy teraz:
#define ABC abc
#pragma message "The value of ABC is: " ABC
co jest równoważne
#pragma message "The value of ABC is: " abc
Powoduje to ostrzeżenie preprocesora, ponieważ abc (bez cudzysłowu) nie może zostać połączone z poprzednim ciągiem.
Rozważmy teraz preprocesor stringize (który kiedyś był nazywany stringification, linki w dokumentacji zostały zmienione, aby odzwierciedlić poprawioną terminologię. (Nawiasem mówiąc, oba terminy są równie obrzydliwe. Prawidłowy termin to oczywiście stringifaction. Przygotuj się do aktualizacji Twoje linki.)). Działa to tylko na argumentach makra i zastępuje nierozwinięty argument argumentem ujęty w podwójne cudzysłowy. A zatem:
#define STR(x) #x
char *s1 = "abc";
char *s2 = STR(abc);
przypisze identyczne wartości s1 i s2. Jeśli uruchomisz gcc -E, zobaczysz to na wyjściu. Być może STR byłoby lepiej nazwane czymś w rodzaju ENQUOTE.
To rozwiązuje problem umieszczania cudzysłowów wokół niecytowanego elementu, problem polega teraz na tym, że jeśli argumentem jest makro, makro nie zostanie rozwinięte. Dlatego potrzebne jest drugie makro. XSTR rozszerza swój argument, a następnie wywołuje STR, aby umieścić rozwiniętą wartość w cudzysłowie.