SORU
12 Aralık 2012, ÇARŞAMBA


C C < /makro

Böyle bir makro var

#define FOO(type,name) type name

Gibi kullanabiliriz

FOO(int, int_var);

Ama her zaman bu kadar basit değil:

FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2

Elbette yapabiliriz:

 typedef std::map<int, int> map_int_int_t;
 FOO(map_int_int_t, map_var); // OK

kadar esnek olan. Artı tip uyumsuzlukları ele alınması gerekiyor. Makro ile bu sorunu çözmek için nasıl herhangi bir fikir ?

CEVAP
12 Aralık 2012, ÇARŞAMBA


Çünkü köşeli parantez de gösterir (ya da ortaya) karşılaştırma operatörleri <, >, <= ve >=, makro genişleme olabilir mi görmezden virgül içinde köşeli parantez gibi geliyor ile çeşitli dengeli parantez (), [] {}. Parantez içinde makro bağımsız değişkeni alın

FOO((std::map<int, int>), map_var);

Sorun parametre çoğu bağlamda bir tür olarak okunur önler makro genişleme, iç parenthesized kalır o zaman.

Bu geçici çözüm için güzel bir hile C programlama dilinde * sembolü bir tür adı işlevi , bir tür kullanarak bir typename çıkarabilirsiniz:

template<typename T> struct argument_type;
template<typename T, typename U> struct argument_type<T(U)> { typedef U type; };
#define FOO(t,name) argument_type<void(t)>::type name
FOO((std::map<int, int>), map_var);

Oluşturan fonksiyonları ekstra parantez yok sayar çünkü, tür adı, virgül içermez parantez olmadan bu makroyu kullanabilirsiniz:

FOO((int), int_var);
FOO(int, int_var2);

Elbette C, bu tür adları parantez dışında virgül içeremez, çünkü gerekli değil. Yani, diller arası bir makro yazabilirsiniz:

#ifdef __cplusplus__
template<typename T> struct argument_type;
template<typename T, typename U> struct argument_type<T(U)> { typedef U type; };
#define FOO(t,name) argument_type<void(t)>::type name
#else
#define FOO(t,name) t name
#endif

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kremosakhaz

    kremosakhaz

    25 AĞUSTOS 2006
  • NightShader1

    NightShader1

    25 Temmuz 2006
  • superemposed

    superemposed

    25 Aralık 2007