kpa*_*cha 2 c variadic-functions
我开始想知道printf函数是如何声明的,它总是接收一个字符串作为第一个参数(好吧,const char*),然后其余参数可以是各种类型,它们的数量可变并且以不同的顺序给出。
这是否意味着printf针对每种可能性都对函数进行了声明和覆盖?这对我来说意义不大,所以它真的像这样工作还是与众不同?
另外,该功能如何实现?如果太复杂了,我只想知道它在内部一般是如何工作的。
如何声明printf函数
?int printf( const char *restrict format, ... );
^^^
Run Code Online (Sandbox Code Playgroud)
该...或省略号表示有争论的可变号码,我们将使用的va_start,在va_arg,va_end用来宏和va_list的类型来访问这些参数。
该功能如何实现?
上面链接的文档中给出了一个非常简单的printf的示例,如下所示,并对其进行了修改以在C中工作:
#include <stdio.h>
#include <stdarg.h>
void simple_printf(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
while (*fmt != '\0') {
if (*fmt == 'd') {
int i = va_arg(args, int);
printf( "%d\n", i ) ;
} else if (*fmt == 'c') {
int c = va_arg(args, int);
printf( "%c\n", (char)c ) ;
} else if (*fmt == 'f') {
double d = va_arg(args, double);
printf( "%f\n", d ) ;
}
++fmt;
}
va_end(args);
}
int main()
{
simple_printf("dcff", 3, 'a', 1.999, 42.5);
}
Run Code Online (Sandbox Code Playgroud)