2016-04-17 1 views
0

J'ai une fonction qui fonctionne avec des arguments variables et ressemble à ceci:Erreur de compilation avec GCC lors de l'utilisation des arguments variables

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

Ce code compile bien avec Windows/VisualStudio 2012 et « anciennes » versions de GCC (comme 4.7 sur CentOS 6). Mais cela échoue quand je tente de le compiler avec GCC 4.8.4/Ubuntu. Ici, je reçois erreur suivante:

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

Quelqu'un a une idée de ce qui ne va pas ici? Pourquoi GCC se plaint-elle?

Merci!

+0

Il est 2016. Pourquoi les varargs? –

+1

Ne pas passer l'argument 'va_list' comme un pointeur? Si vous regardez de plus près le message d'erreur, vous verrez qu'il est déjà * un * pointeur, c'est à dire type-alias ('typedef') pour' __va_list_tag * ', donc vous n'avez pas besoin d'utiliser des pointeurs pour émuler pass-by -référence. –

+0

Légèreté Courses en Orbite: parce que les interfaces DLL doivent toujours être simples, les interfaces C++ dépendent de la version exacte du compilateur. – Elmi

Répondre

1

Toujours transmettre va_list par valeur, jamais par pointeur.

Par conséquent:

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

et

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