C ile makro oluşturma ## ve __SATIR__ (konumlandırma makro ile token birleştirme)
Adı temel fonksiyonu bir C makrosu oluşturmak istiyorum satır numarası üzerinde. (Gerçek işlevi parantez içinde ifadeler olurdu) gibi bir şey yapabileceğimi düşündüm:
#define UNIQUE static void Unique_##__LINE__(void) {}
Ben umduğu gibi bir şey için genişletin:
static void Unique_23(void) {}
Bu işe yaramıyor. Token ile birleştirme, konumlandırma makrolar tam anlamıyla tedavi edilir, biten genişletilmesi:
static void Unique___LINE__(void) {}
Bunu yapmak mümkün mü?
(Evet, bu gibi görünüyor ne kadar iyi olursa olsun istiyorum gerçek bir sebebi var).
CEVAP
Sorun o zaman var bir makro değiştirme, basit tek genişletme makroları yinelemeli eğer ne stringizing operatörü #
ne token yapıştırma operatörü ##
uygulanır. Yani, yönlendirme fazladan kat kullanmak zorunda, özyinelemeli genişletilmiş bir tartışma ile token yapıştırma operatörü kullanabilirsiniz:
#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define UNIQUE static void TOKENPASTE2(Unique_, __LINE__)(void) {}
Sonra, __LINE__
alır genişletilmiş satır numarası sırasında genişleme UNIQUE
(değil dahil de #
##
) ve token yapıştırma sırasında meydana genişleme TOKENPASTE
.
Gerektiğini de kaydetti orada da __COUNTER__
makro, genişler için yeni bir tamsayı her zaman değerlendirilir, gerek duyduğunuzda birden fazla örneklemesi ve UNIQUE
makro aynı satırda. Not: __COUNTER__
Visual Studio ve GCC (beri V4.MS tarafından desteklenmektedir 3) ama standart değil)
Aşırı Sayıda Bağımsız değişken üzerind...
İki kez C ön işlemci ile bağlamak ve &...
Neden #sadece 1 yerine C boolean bir m...
pragma tanımlamak makro...
Neden bu 20 yerine 10 olarak değiştiri...