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!
Il est 2016. Pourquoi les varargs? –
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. –
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