2011-04-03 19 views
16

मुझे एक वैरैडिक मैक्रो (वर्तमान में 16 तर्क तक सीमित) में तर्कों की संख्या प्राप्त करने के लिए निम्नलिखित कार्यान्वयन मिला है। हालांकि, वीएस -2010 के लिए उत्पादन हमेशा 1 होता है, इससे कोई फर्क नहीं पड़ता कि कितने तर्क पारित किए गए हैं। With GCC, आउटपुट सही है, मुझे इस निष्कर्ष पर पहुंचा कि मैंने एमएसवीसी (10) के लिए कुछ विशिष्ट याद किया होगा।वीसी ++ के साथ यह विविध तर्क तर्क मैक्रो विफल क्यों होता है?

#define PP_NARGS(...) \ 
    _xPP_NARGS_IMPL(__VA_ARGS__,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) 

#define _xPP_NARGS_IMPL(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,N,...) N 

int main(){ 
    int i = PP_NARGS(A,V,C,X,Y,Z); 

    std::cout << i; 

    std::cin.get(); 
    return 0; 
} 

तो सवाल शीर्षक राज्यों के रूप में है, किसी भी मदद की सराहना की जाएगी।

उत्तर

23

क्या निम्न कार्य-आसपास सहायता करता है?

#define EXPAND(x) x 
#define PP_NARGS(...) \ 
    EXPAND(_xPP_NARGS_IMPL(__VA_ARGS__,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)) 

मुझे लगता है कि अपने मैक्रो विशेष रूप से गलत नहीं है, लेकिन MSVC के __VA_ARGS__ विस्तार C99 से अलग तरीके से व्यवहार करने लगता है।

+0

ओमग, यह * काम * करता है! बहुत बढ़िया! क्या आपके पास कोई स्पष्टीकरण है क्यों? – Xeo

+1

मुझे खुशी है कि मैं मदद कर सकता हूं :-) ईमानदारी से, मैं समझा नहीं सकता क्यों (दोह)। जैसा कि मैंने उत्तर में लिखा था, मुझे लगता है कि आपका मैक्रो सी 99 मानक में ठीक है। मैं 'EXPAND' सामान को पूरी तरह से काम के रूप में समझता हूं, और शायद इसमें कोई तकनीकी रूप से दिलचस्प विषय नहीं है ... के अनुसार [यहां] (http://connect.microsoft.com/VisualStudio/feedback/details/380090/variadic-macro-replacement), यह वीसी के बग-आश व्यवहार जैसा लगता है। –

+0

इस कामकाज के लिए बहुत बहुत धन्यवाद। वीएस 14 सीटीपी 3 में वर्णित अनुसार काम करता है (जहां एक बग, 2008 में एमएस द्वारा स्वीकार किया गया [सीएफ। आईएसई लिंक], अभी भी मौजूद है)। –

-9

__VA_ARGS__ एक सी 99 भाषा सुविधा है।
वीसी ++ एक सी 99 संकलक नहीं है।
गणित करें।

यह एक योजना संकलक के साथ पास्कल को संकलित करने की कोशिश करने जैसा है और यह अजीब लगता है कि यह 'प्रारंभ/अंत' जोड़े के लिए काम नहीं करता है।

मुझे नहीं पता कि सी ++ और विजुअल स्टूडियो इस सब में कैसे व्यवहार करते हैं।

+0

हालांकि [MSDN] (http://msdn.microsoft.com/en-us/:


सम्भावित समाधान, के रूप में Ise Wisteria पहले से ही ने सुझाव दिया, के माध्यम से विस्तार के लिए मजबूर करने के लिए है लाइब्रेरी/एमएस 177415% 28 वी = वीएस.100% 2 9 .aspx) आपके साथ और उनके शब्दों से असहमत प्रतीत होता है, मुझे विश्वास है कि मुझे '__VA_ARGS__' का उपयोग करने में सक्षम होना चाहिए। – Xeo

+0

आपके द्वारा लिंक किए गए पृष्ठ में उदाहरण C++ (या इससे भी अधिक अजीब "सी/सी ++") प्रतीत होता है। मेरा मतलब केवल सी – pmg

+0

को प्रतिबिंबित करने का मेरा मतलब था [मेरा एमएसडीएन पृष्ठ] (http://msdn.microsoft.com/en-us/library/teas0593.aspx) दृश्य स्टूडियो के भीतर सी मैक्रोज़ का संदर्भ है। – pmg

1

समस्या यह प्रतीत होती है कि विजुअल स्टूडियो __VA_ARGS__ के बाद इसे बाद के मैक्रो में पास कर रहा है, जबकि जीसीसी इसे पार करने से पहले फैलाता है।

आपके मामले में, PP_NARGS(A,V,C,X,Y,Z)__VA_ARGS__ को A,V,C,X,Y,Z बांधता है, और फिर _xPP_NARGS_IMPL करने के लिए एक पूरे के रूप में यह गुजरता है।

एक परीक्षण के रूप में, चलाएँ:

#define PP_NARGS(...) \ 
    _xPP_NARGS_IMPL(__VA_ARGS__,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) 

#define _xPP_NARGS_IMPL(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,N,...) \ 
    (std::cout << #x1 << std::endl, N) 

int main() { 
    int i = PP_NARGS(A, V, C, X, Y, Z); 
    std::cout << i; 
    return 0; 
} 

आप A, V, C, X, Y, Z स्क्रीन पर मुद्रित, और न सिर्फ A देखेंगे जैसा कि आप शायद उम्मीद करेंगे।

#define EXPAND(x) x 
#define PP_NARGS(...) \ 
    EXPAND(_xPP_NARGS_IMPL(__VA_ARGS__,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)) 
संबंधित मुद्दे