Est-il possible d’avoir une fonction variadique en C sans paramètre non variadique?

J’ai la fonction suivante:

void doStuff(int unusedParameter, ...) { va_list params; va_start(params, unusedParameter); /* ... */ va_end(params); } 

Dans le cadre d’un refactor, j’aimerais supprimer le paramètre inutilisé sans modifier autrement l’implémentation de la fonction. Autant que je va_start , il est impossible d’utiliser va_start sans un dernier paramètre non variadique auquel se référer. Y a-t-il un moyen de contourner cela?

Contexte: Il s’agit en fait d’un programme C ++. Je pourrais donc utiliser la magie de la surcharge d’opérateur proposée ci -dessus, mais j’espérais ne pas avoir à changer d’interface à ce stade.

La fonction existante effectue son travail en exigeant que la liste d’arguments de variable soit terminée par un caractère null, et en recherchant NULL. Par conséquent, elle n’a pas besoin d’un argument de tête pour lui indiquer le nombre d’arguments dont elle dispose.

En réponse aux commentaires: je n’ai pas à supprimer le paramètre inutilisé, mais je le ferais s’il existait un moyen propre de le faire. J’espérais qu’il y aurait quelque chose de simple qui m’aurait manqué.

Vous avez le choix entre le laisser tel quel et utiliser va_list , alias (si c’est GCC) comme d’autres l’ont souligné, ou faire quelque chose dans le sens de l’interface exec(2) – en passant un tableau de pointeurs nécessitant un terminateur NULL :

 /* \param args NULL-terminated array of * pointers to arguments. */ void doStuff( void* args[] ); 

Quoi qu’il en soit, il serait bien préférable de refacturer l’interface pour tirer parti du système de types – peut-être surcharger les types d’arguments exacts utilisés:

 void doStuff( int ); void doStuff( const std::ssortingng& ); void doStuff( const MyFancyAppClass& ); 

J’espère que cela t’aides.

GCC propose une solution de contournement: vous pouvez définir une macro avec un nombre variable d’arguments, puis append le paramètre dummy dans l’extension:

 #define doStuff(...) realDoStuff(0, __VA_ARGS__)