2013-03-10 9 views
6

I Wanna passare NULL per il 4 ° param delle seguenti funzioni:Come devo passare NULL al parametro della funzione va_list?

bool CCMenuItemToggle :: initWithTarget (CCObject * bersaglio, selettore SEL_MenuHandler, CCMenuItem * voce, args va_list);

come questo:

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

E 'ok quando costruire in XCode (clang3.1). Ma quando ho porto il codice per Android NDK (g ++ 4.7), non riesce a compilare:

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

Come devo fare con esso?

risposta

10

Presumo che il codice funzionerà se si utilizza solo uno va_list vuoto anziché NULL.

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

Edit: Forse questa soluzione alternativa funziona con entrambi i compilatori.

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

Ho appena notato che ho testato la soluzione con ndk (clang3.1). Quando torno a ndk (g ++ 4.7), riporta errore: 'Errore interno del compilatore: in build_zero_init_1, in cp/init.c: 280' – smilingpoplar

+0

Beh, non penso di esserne responsabile. La risposta è ancora corretta. Il compilatore è rotto. Forse aiuta a dichiarare una variabile prima della chiamata e passa la variabile. Vedi modifica sopra. – Thomas

+0

Fresco, la soluzione alternativa più avanti funziona per entrambi i compilatori. : D – smilingpoplar

0

Vedo che questa domanda ha avuto risposta, ma non è standard. il seguente codice avverrà attraverso un errore di runtime in Visual Studios; tuttavia, funziona bene con g ++.

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

Una soluzione migliore sarebbe quella di creare una coppia di funzioni di supporto che costruiscono una va_list vuota.

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; 
} 

rendono il doCreateEmptyVa_list privato e poi quando si chiama la funzione di chiamata

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

Non è possibile passare NULL come quarto argomento della funzione. Quella funzione richiede un argomento va_list. NULL in generale non è un inizializzatore valido per un oggetto va_list. Quindi, la risposta alla tua domanda è: non è possibile.

Il modo in cui dovresti gestirlo dipende da cosa stai cercando di fare.

Problemi correlati