在C Reference Manual by Dennis M. Ritchie 中查看早在... 和<stdarg.h> 之前就存在的printf() 的实现:
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´ ) ;
}
您可以忽略函数和参数声明的旧 (AKA K&R) 语法:
printf ( fmt, args )
char fmt [ ] ;
甚至用更现代的替换它:
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 */
...
}
这说明了机制。
请注意,如果您这样编写代码,它将无法移植,甚至可能无法与您的编译器一起工作。