USER, tırnak içine alınmış bir dize olarak tanımlanmışsa bunu yapamazsınız.
Ama olabilir KULLANICI sadece JACK veya QUEEN veya Joker ya da her türlü ise böyle yapar.
Kullanılacak iki numara var:
- Bir tanımlayıcıyı başka bir tanımlayıcıyla sadece karakterlerini birleştirerek birleştirdiğiniz belirteç ekleme. Bu, bir
#define JACK
şeye gerek kalmadan JACK ile karşılaştırma yapmanıza olanak tanır
- değişken sayıda bağımsız değişken içeren makroları işlemenizi sağlayan değişken makro genişletme. Bu, belirli tanımlayıcıları, dize karşılaştırmanız haline gelecek olan çeşitli virgül sayılarına genişletmenize olanak tanır.
Öyleyse şununla başlayalım:
#define JACK_QUEEN_OTHER(u) EXPANSION1(ReSeRvEd_, u, 1, 2, 3)
Şimdi, JACK_QUEEN_OTHER(USER)
yazarsam ve USER JACK ise, önişlemci bunuEXPANSION1(ReSeRvEd_, JACK, 1, 2, 3)
İkinci adım birleştirme:
#define EXPANSION1(a, b, c, d, e) EXPANSION2(a##b, c, d, e)
Şimdi JACK_QUEEN_OTHER(USER)
olurEXPANSION2(ReSeRvEd_JACK, 1, 2, 3)
Bu, bir dizenin eşleşip eşleşmediğine göre bir dizi virgül ekleme fırsatı verir:
#define ReSeRvEd_JACK x,x,x
#define ReSeRvEd_QUEEN x,x
KULLANICI JACK ise JACK_QUEEN_OTHER(USER)
,EXPANSION2(x,x,x, 1, 2, 3)
KULLANICI KRALİÇ ise, JACK_QUEEN_OTHER(USER)
olurEXPANSION2(x,x, 1, 2, 3)
USER başka biriyse, JACK_QUEEN_OTHER(USER)
olurEXPANSION2(ReSeRvEd_other, 1, 2, 3)
Bu noktada kritik bir şey oldu: EXPANSION2 makrosunun dördüncü argümanı, geçirilen orijinal argümanın vale, kız veya başka bir şey olmasına bağlı olarak 1, 2 veya 3'tür. Yani tek yapmamız gereken onu seçmek. Uzun soluklu nedenlerden dolayı, son adım için iki makroya ihtiyacımız olacak; Gereksiz görünse bile bunlar EXPANSION2 ve EXPANSION3 olacaktır.
Hepsini bir araya getirirsek, şu 6 makroya sahibiz:
#define JACK_QUEEN_OTHER(u) EXPANSION1(ReSeRvEd_, u, 1, 2, 3)
#define EXPANSION1(a, b, c, d, e) EXPANSION2(a##b, c, d, e)
#define EXPANSION2(a, b, c, d, ...) EXPANSION3(a, b, c, d)
#define EXPANSION3(a, b, c, d, ...) d
#define ReSeRvEd_JACK x,x,x
#define ReSeRvEd_QUEEN x,x
Ve bunları şu şekilde kullanabilirsiniz:
int main() {
#if JACK_QUEEN_OTHER(USER) == 1
printf("Hello, Jack!\n");
#endif
#if JACK_QUEEN_OTHER(USER) == 2
printf("Hello, Queen!\n");
#endif
#if JACK_QUEEN_OTHER(USER) == 3
printf("Hello, who are you?\n");
#endif
}
Zorunlu godbolt bağlantısı: https://godbolt.org/z/8WGa19