C, Traitement des fonctions à arguments variables

Disons que je veux faire quelque chose comme ça

void my_printf(char *fmt,...) { char buf[big enough]; sprintf(buf,fmt,...); } 

Quelle est la bonne façon de passer le nombre variable d’arguments directement à une fonction avec accepte les arguments variables?

sprintf a un formulaire vsprintf appelé vsprintf . Passez le va_list vous construisez localement comme dernier argument.

 void my_printf(char *fmt,...) { va_list ap; va_start(ap, fmt); char buf[big enough]; vsprintf(buf,fmt,ap); va_end(ap); } 

Je ne suis pas sûr de l’utilité de ce code, car il s’agit de C ++, mais il montre comment vérifier, à l’aide d’une fonction spécifique à Win32 vsnprintf (), que la mémoire tampon allouée est suffisamment grande et si elle n’en alloue pas une plus grande. Et il retourne un std :: ssortingng, vous devrez donc utiliser malloc / realloc pour gérer cela. Mais que diable:

 ssortingng Format( const char * fmt, ... ) { const int BUFSIZE = 1024; int size = BUFSIZE, rv = -1; vector  buf( size ); do { va_list valist; va_start(valist, fmt ); // if vsnprintf() returns < 0, the buffer wasn't big enough // so increase buffer size and try again rv = _vsnprintf( &buf[0], size, fmt, valist ); va_end( valist ); size *= 2; buf.resize( size ); } while( rv < 0 ); return string( &buf[0] ); } 

Vous pouvez utiliser les fonctions de style vsprintf pour obtenir une impression de style printf pour votre paramètre de longueur variable. Cependant, il n’y a aucune obligation à le faire. Si vous choisissez d’écrire votre fonction, vous pouvez continuer à accepter les parameters jusqu’à ce qu’elle rencontre un pointeur null.

  va_list ap; char *param; va_start(ap,fmt); param = va_arg(ap,char*); while(param) { do something... param = va_arg(ap,char*); } 

ou vous pouvez avoir le nombre de parameters en tant que premier paramètre de votre fonction

 void my_printf(int param_num,...) { va_list ap; char *param; va_start(ap,fmt); while(param_num) { do something... param = va_arg(ap,char*); param_num--; } } 

C’est vraiment à vous, les possibilités sont illimitées. Je pense que la seule exigence réelle concernant les ellipses est qu’elle ait au moins un paramètre avant les ellipses.