C 未知类型的可变参数

C 未知类型的可变参数,c,calling-convention,C,Calling Convention,使用stdarg.h,我只能提取一个类型,因为我必须知道我检索的类型。那么,printf是如何成为任何类型的变量函数的,用C语言编写的?printf()使用格式字符串在运行时确定要提取的参数类型 我还没有查看printf()的源代码,但是一个可能的实现可能包含如下开关: switch (type_specifier) { case 's': str = va_arg(args, char *); /* output str as a string */ break; ca

使用stdarg.h,我只能提取一个类型,因为我必须知道我检索的类型。那么,printf是如何成为任何类型的变量函数的,用C语言编写的?

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.
}

请注意,如果考虑到所有不同类型的参数、参数的大小,“%*d”会额外使用va_arg()来获取数字的宽度,那么完整的实现将比这复杂得多,宽度说明符也可以改变输出。

printf的实际实现要比这复杂得多,但您有正确的核心思想。(例如,请看,如果你认为这是一个烂摊子,glibc中的那一个更糟。)@zwol确实如此。这并不是为了实现任何功能完全的
printf()
实现。我的目的只是展示如何在运行时改变从varargs列表中提取的arg的类型。在汇编程序中,这对代码来说肯定是一件痛苦的事情。不管怎样,这很有道理@里奥库谁说了什么在集会上?zwol链接的代码都是C.@Riolku-Nope。现代的C实现将用C语言编写,因为在汇编语言中这样做根本没有理由。许多年前,我实际上在Z80汇编程序中编制了一个极小值(char、16位int、32位IEEE浮点、仅字符串)
printf()
。这不是我建议做的事情,这是一项重大任务。这是一个运行良好的IEEE浮点库,我可以使用16位整数乘法和除法。如果没有这些,它将从主要的发展成为巨大的。