Bunun orijinal sorgudan çok sonra olduğunu biliyorum, ancak bu yine de yararlı olabilir.
Bu, "#" stringify operatörü kullanılarak GCC'de yapılabilir, ancak iki aşama gerektirir.
#define XSTR(x) STR(x)
#define STR(x) #x
Bir makronun değeri daha sonra şu şekilde görüntülenebilir:
#pragma message "The value of ABC: " XSTR(ABC)
Bakınız: 3.4 gcc çevrimiçi belgelerinde Dizgileştirme.
Nasıl çalışır:
Ön işlemci, alıntılanan dizeleri anlar ve bunları normal metinden farklı şekilde işler. Dize birleştirme, bu özel muamelenin bir örneğidir. Mesaj pragması, tırnak içine alınmış bir dizge olan bir argüman gerektirir. Bağımsız değişkenin birden fazla bileşeni olduğunda, dize birleştirme uygulanabilmesi için bunların tümü dize olmalıdır. Önişlemci, alıntılanmamış bir dizenin, alıntılanmış gibi ele alınması gerektiğini asla varsayamaz. Öyleyse:
#define ABC 123
int n = ABC;
derlenmez.
Şimdi düşünün:
#define ABC abc
#pragma message "The value of ABC is: " ABC
eşdeğer olan
#pragma message "The value of ABC is: " abc
Bu bir önişlemci uyarısına neden olur çünkü abc (tırnaksız) önceki dizeyle birleştirilemez.
Şimdi önişlemci dizesini düşünün (Bir zamanlar dizgeleştirme olarak adlandırılan, dokümantasyondaki bağlantılar, revize edilmiş terminolojiyi yansıtacak şekilde değiştirildi. (Tesadüfen, her iki terim de aynı derecede kötüdür. Doğru terim, elbette, sertleştirmedir. Güncellemeye hazır olun bağlantılarınız.)) operatörü. Bu, yalnızca bir makronun argümanlarına etki eder ve genişletilmemiş argümanı çift tırnak içine alınmış argümanla değiştirir. Böylece:
#define STR(x) #x
char *s1 = "abc";
char *s2 = STR(abc);
s1 ve s2'ye aynı değerleri atayacaktır. Gcc -E komutunu çalıştırırsanız, bunu çıktıda görebilirsiniz. Belki STR, ENQUOTE gibi bir isimle adlandırılsa daha iyi olur.
Bu, alıntı yapılmamış bir öğenin etrafına tırnak işareti koyma sorununu çözer, şimdi sorun, eğer argüman bir makro ise, makronun genişletilmemesidir. Bu nedenle ikinci makroya ihtiyaç vardır. XSTR bağımsız değişkenini genişletir, ardından genişletilmiş değeri tırnak içine almak için STR'yi çağırır.