SORU
20 EKİM 2009, Salı


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
20 EKİM 2009, Salı


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)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FamilyFeud

    FamilyFeud

    22 AĞUSTOS 2006
  • Mega64

    Mega64

    24 ŞUBAT 2006
  • Submissions101

    Submissions1

    23 ŞUBAT 2007