क्योंकि कोण कोष्ठक भी प्रतिनिधित्व करते हैं (या में होते हैं) कर सकते हैं तुलना ऑपरेटरों <
, >
, <=
और >=
, मैक्रो विस्तार कोण कोष्ठक के अंदर के लिए अल्पविराम नजरअंदाज नहीं कर सकते जैसे कि यह कोष्ठकों के भीतर है। (यह वर्ग कोष्ठक और ब्रेसिज़ के लिए भी एक समस्या है, भले ही वे आमतौर पर संतुलित जोड़े के रूप में होते हैं।) आप कोष्ठक में मैक्रो तर्क को संलग्न कर सकते हैं:
FOO((std::map<int, int>), map_var);
समस्या यह है कि पैरामीटर मैक्रो विस्तार के अंदर कोष्ठक बना रहता है, जो इसे अधिकांश संदर्भों में एक प्रकार के रूप में पढ़ने से रोकता है।
वर्कअराउंड करने के लिए एक अच्छी चाल यह है कि C ++ में, आप एक फ़ंक्शन का उपयोग करके एक कोष्ठक प्रकार के नाम से एक टाइपनेम निकाल सकते हैं:
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);
क्योंकि फ़ंक्शन प्रकार बनाने से अतिरिक्त कोष्ठक की उपेक्षा होती है, आप इस मैक्रो का उपयोग बिना कोष्ठक के साथ या उसके बिना कर सकते हैं जहाँ टाइप नाम में अल्पविराम शामिल नहीं है:
FOO((int), int_var);
FOO(int, int_var2);
सी में, निश्चित रूप से, यह आवश्यक नहीं है क्योंकि टाइप नाम में कोष्ठक के बाहर अल्पविराम नहीं हो सकता है। तो, एक क्रॉस-भाषा मैक्रो के लिए आप लिख सकते हैं:
#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