2013-03-10 4 views
6

मैं निम्नलिखित समारोह के 4 परम करने के लिए शून्य से पारित करना चाहते हैं:मुझे va_list फ़ंक्शन पैरामीटर में NULL कैसे पास करना चाहिए?

bool CCMenuItemToggle :: initWithTarget (CCObject * लक्ष्य, SEL_MenuHandler चयनकर्ता, CCMenuItem * आइटम, va_list आर्ग);

इस तरह:

CCMenuItemToggle::initWithTarget(this, menu_selector(GOSound::toggleButtonCallback), NULL, NULL);

जब मैं XCode (clang3.1) में इसे बनाने ठीक है। लेकिन जब मैं बंदरगाह एंड्रॉयड NDK (छ ++ 4.7) के लिए कोड, यह संकलन करने में विफल रहता है:

no viable conversion from 'int' to 'va_list' (aka '__builtin_va_list')

मैं कैसे इसके साथ सौदा करना चाहिए?

उत्तर

10

मुझे लगता है कि अगर आप नल के बजाय खाली va_list का उपयोग करते हैं तो आपका कोड काम करेगा।

CCMenuItemToggle::initWithTarget(this, menu_selector(GOSound::toggleButtonCallback) 
           , NULL, va_list()); 

संपादित करें: हो सकता है कि इस वैकल्पिक समाधान दोनों compilers के साथ काम करता है।

va_list empty_va_list; 
CCMenuItemToggle::initWithTarget(this, menu_selector(GOSound::toggleButtonCallback) 
           , NULL, empty_va_list); 
+1

मुझे लगता है कि मैंने आपके समाधान का परीक्षण ndk (clang3.1) के साथ किया था। जब मैं ndk (g ++ 4.7) पर वापस स्विच करता हूं, तो यह त्रुटि की रिपोर्ट करता है: 'आंतरिक कंपाइलर त्रुटि: build_zero_init_1 में, cp/init.c: 280' – smilingpoplar

+0

पर मुझे नहीं लगता कि मैं इसके लिए ज़िम्मेदार हूं। जवाब अभी भी सही है। संकलक टूट गया है। हो सकता है कि यह कॉल को एक चर के घोषित करने और चर को पास करने में मदद करता है। उपरोक्त संपादन देखें। – Thomas

+0

कूल, बाद में कामकाज दोनों कंपाइलरों के लिए काम करता है। : डी – smilingpoplar

0

मुझे लगता है कि इस प्रश्न का उत्तर दिया गया था लेकिन यह मानक नहीं है। निम्नलिखित कोड विजुअल स्टूडियो में रनटाइम त्रुटि के माध्यम से होगा; हालांकि, यह g ++ के साथ ठीक काम करता है।

va_list empty_va_list; 
CCMenuItemToggle::initWithTarget(this, menu_selector(GOSound::toggleButtonCallback), NULL, empty_va_list); 

एक बेहतर समाधान एक खाली va_list बनाने वाले कुछ सहायक कार्यों को बनाना होगा।

va_list CCMenuItemToggle::createEmptyVa_list() 
{ 
    return doCreateEmptyVa_list(0); 
} 

va_list CCMenuItemToggle::doCreateEmptyVa_list(int i,...) 
{ 
    va_list vl; 
    va_start(vl,i); 
    return vl; 
} 

doCreateEmptyVa_list निजी बनाने और उसके बाद जब आप अपने समारोह कॉल

CCMenuItemToggle::initWithTarget(this, menu_selector(GOSound::toggleButtonCallback), NULL, CreateEmptyVa_list()); 
0

फोन आप अपने समारोह के चौथे तर्क के रूप में NULL पारित नहीं कर सकते हैं। उस फ़ंक्शन को va_list तर्क की आवश्यकता है। सामान्य स्थिति में NULLva_list ऑब्जेक्ट के लिए मान्य प्रारंभकर्ता नहीं है। तो, आपके प्रश्न का उत्तर यह है: यह संभव नहीं है।

आप इससे कैसे निपटना चाहिए इस पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं।

संबंधित मुद्दे