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)
Neden o'In önceden tanımlanmış bi...
define cmake ile basit makro...
Nasıl variadic bir makro (bağımsız değ...
Neden bir makro savunmak ve bir fonksi...
iOS Nasıl algılamak iPhone 6 plus, 6, ...