2016-04-17 13 views
0

Verwendung habe ich eine Funktion, die mit variablen Argumenten arbeitet und sieht wie folgt aus:Compile Fehler mit GCC, wenn variable Argumente

static int getIntValue(const int min,const int max,va_list *vl) 
{ 
    int listValue; 

    listValue=va_arg(*vl,int); 
    if (listValue<min) listValue=min; 
    else if (listValue>max) listValue=max; 
    return listValue; 
} 


unsigned long init_if_list(int *var,va_list vl) 
{ 
    char *listTag; 

    listTag=va_arg(vl,char*); 
    if (!strcmp(listTag,INIT_SHOWUI)) initValues.uiFlags=getIntValue(INT_MIN,INT_MAX,&vl); 

Dieser Code kompiliert gut mit Windows/Visual Studio 2012 und „älteren“ GCC-Versionen (wie 4.7 auf CentOS 6). Aber es schlägt fehl, wenn ich versuche, es mit GCC 4.8.4/Ubuntu zu kompilieren. Hier bekomme ich folgenden Fehler:

error: cannot convert '__va_list_tag**' to '__va_list_tag (*)[1]' for argument '3' to 'int getIntValue(int, int, __va_list_tag (*)[1])' 
    if (!strcmp(listTag,INIT_SHOWUI))    initValues.uiFlags=getIntValue(INT_MIN,INT_MAX,&vl); 

Irgendjemand eine Idee was ist hier falsch? Warum klagen die GCC?

Danke!

+0

Es ist 2016. Warum die varargs? –

+1

Übergeben Sie das Argument 'va_list' nicht als Zeiger? Wenn Sie sich die Fehlermeldung genauer ansehen, sehen Sie, dass es bereits * ein Zeiger ist, dh es ist Typ-Alias ​​('typedef ') für' __va_list_tag * ', so dass Sie Zeiger nicht verwenden müssen, um Vorbeigehen zu emulieren -Referenz. –

+0

Leichtigkeit im Orbit: Da DLL-Interfaces immer noch einfach sein müssen, sind C++ - Interfaces abhängig von der genauen Version des Compilers. – Elmi

Antwort

1

Übergeben Sie immer va_list nach Wert, niemals per Zeiger.

Deshalb:

static int getIntValue(const int min, const int max, va_list vl) 

und

initValues.uiFlags=getIntValue(INT_MIN, INT_MAX, vl);