Arguments de longueur variable sans utiliser stdarg.h

J’essaie de comprendre et de mettre en œuvre un moyen de gérer une fonction d’argument de longueur variable en vérifiant la stack, mais je ne sais pas par où ni comment commencer. J’ai trouvé les liens suivants utiles mais je ne comprends toujours pas comment je pourrais obtenir quelque chose comme ceci en c pour quelque chose comme une fonction d’impression.

http://www.swig.org/Doc1.3/Varargs.html

Points de fin (…) dans la liste d’arguments de fonctions en C ++

Regardez dans le C Reference Manual by Dennis M. Ritchie la mise en oeuvre de printf() qui existait bien avant ... et :

 printf ( fmt, args ) char fmt [ ] ; { ... int *ap, x, c ; ap = &args ; /* argument pointer */ ... for ( ; ; ) { while ( ( c = *fmt++ ) != ´%´ ) { ... switch ( c = *fmt++) { /* decimal */ case ´d ´: x = *ap++ ; if(x < 0) { x = -x; if ( x<0 ) { /* is - infinity */ printf ( "-32768" ) ; continue ; } putchar ( ´-´); } printd(x); continue ; ... } ... } ... } } printd(n) { int a ; if ( a=n/10 ) printd(a); putchar ( n%10 + ´0´ ) ; } 

Vous pouvez ignorer l'ancienne syntaxe (AKA K & R) de la déclaration de fonction et de paramètre:

 printf ( fmt, args ) char fmt [ ] ; 

et même le remplacer par un plus moderne:

 int printf ( char fmt[], int args ) 

mais l'idée est la même, vous obtenez un pointeur sur le premier argument optionnel ( args ) directement, comme dans le code ci-dessus avec ap = &args; , puis continuez à l'incrémenter pour avoir access à d'autres arguments.

Ou vous pouvez le faire indirectement, en utilisant le dernier argument non optionnel comme sharepoint départ:

 int printf ( char fmt[], ... ) { ... int *ap, x, c ; ap = &fmt ; /* argument pointer */ ap++; /* ap now points to first optional argument */ ... } 

Ceci illustre le mécanisme.

Attention, si vous écrivez votre code de cette manière, il ne sera pas portable et il pourrait même ne pas fonctionner avec votre compilateur.