未知类型的变量argad

Rio*_*lku 3 c calling-convention

使用stdarg.h,我只能拉一种类型,因为我必须知道我正在检索的类型.那么,printf如何设法成为任何类型的可变函数,在C中不会少?

dgn*_*uff 7

printf() 使用格式字符串在运行时确定要拉什么类型的参数.

我没有看过源代码printf(),但是一个可能的实现可能包含这样的开关:

switch (type_specifier)
{
case 's':
    str = va_arg(args, char *);
    /* output str as a string */
    break;
case 'd':
    number = va_arg(args, int);
    /* output number as a decimal value */
    break;
etc.
etc.
etc.
}
Run Code Online (Sandbox Code Playgroud)

请注意,当您考虑所有各种类型的参数时,完整的实现将比这更复杂,参数可以是所有不同的大小,"%*d"使得额外的va_arg()用法得到数字的宽度,宽度说明符也可以改变输出.

  • 'printf`的真正实现要比这复杂得多,但你有正确的核心思想.(例如参见http://git.musl-libc.org/cgit/musl/tree/src/stdio/vfprintf.c#n108和http://git.musl-libc.org/cgit/musl/tree/ src/stdio/vfprintf.c#n509 - 如果你认为这是一团糟,glibc中的那个更糟糕.) (2认同)