不使用stdarg.h的可变长度参数

时间:2013-03-05 05:07:31

标签: c printf

我试图通过检查堆栈来理解并实现一种处理可变长度参数函数的方法,但我不知道在哪里以及如何启动。我发现以下链接很有帮助,但我仍然不太明白我是如何在c中找到像打印功能这样的东西。

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

Trailing dots (...) within function argument list in C++

1 个答案:

答案 0 :(得分:6)

printf() ...<stdarg.h>之前存在的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´ ) ; } 的实施中查看C Reference Manual by Dennis M. Ritchie

printf ( fmt, args )
  char fmt [ ] ;

您可以忽略功能和参数声明的旧(AKA K&amp; R)语法:

int printf ( char fmt[], int args )

甚至用更现代的代替它:

args

但是想法是一样的,你直接得到一个指向第一个可选参数(ap = &args;)的指针,就像在上面的代码int printf ( char fmt[], ... ) { ... int *ap, x, c ; ap = &fmt ; /* argument pointer */ ap++; /* ap now points to first optional argument */ ... } 中所做的那样,然后继续增加它以获得访问权限进一步论证。

或者你可以使用最后一个非可选参数作为起点间接地做到这一点:

{{1}}

这说明了这种机制。

请注意,如果您编写这样的代码,它将无法移植,甚至可能无法使用您的编译器。