2013-03-10 5 views
6

Ich will bis zum 4. param der folgenden Funktion NULL übergeben:Wie soll ich NULL an den Funktionsparameter va_list übergeben?

Bool CCMenuItemToggle :: initWithTarget (CCObject * Ziel, SEL_MenuHandler Selektor, CCMenuItem * Artikel, va_list args);

wie folgt aus:

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

Es ist in Ordnung, wenn ich es in XCode (clang3.1) bauen. Aber wenn ich Port der Code auf Android NDK (g ++ 4.7), um es zu kompilieren fehlschlägt:

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

Wie soll ich damit umgehen?

Antwort

10

Ich gehe davon aus, dass Ihr Code funktioniert, wenn Sie nur einen leeren va_list anstelle von NULL verwenden.

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

Edit: Vielleicht diese alternative Lösung funktioniert mit beiden Compiler.

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

Ich habe gerade festgestellt, dass ich Ihre Lösung mit ndk (clang3.1) getestet habe. Wenn ich zurück zu ndk (g ++ 4.7) wechsle, meldet es Fehler: 'interner Compilerfehler: in build_zero_init_1, bei cp/init.c: 280' – smilingpoplar

+0

Gut denke ich nicht, dass ich dafür verantwortlich bin. Die Antwort ist immer noch richtig. Der Compiler ist defekt. Vielleicht hilft es, vor dem Aufruf eine Variable zu deklarieren und die Variable zu übergeben. Siehe oben Bearbeiten. – Thomas

+0

Cool, die spätere Problemumgehung funktioniert für beide Compiler. : D – smilingpoplar

0

Ich sehe diese Frage wurde beantwortet, aber es ist nicht Standard. der folgende Code wird durch einen Laufzeitfehler in Visual Studios; es funktioniert jedoch gut mit g ++.

Eine bessere Lösung wäre, ein paar Helferfunktionen zu erstellen, die eine leere va_list erstellen.

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

machen die doCreateEmptyVa_list private und dann, wenn Sie Ihren Funktionsaufruf

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

Sie nicht NULL nennen als vierte Argument Ihrer Funktion übergeben können. Diese Funktion erfordert ein va_list Argument. NULL im allgemeinen Fall ist kein gültiger Initialisierer für ein va_list Objekt. Also, die Antwort auf Ihre Frage ist: Es ist nicht möglich.

Wie Sie damit umgehen sollten, hängt davon ab, was Sie zu tun versuchen.

Verwandte Themen