我开始想知道printf
函数是如何声明的,它总是接收一个字符串作为第一个参数(好吧,const char*
),然后其余参数可以是各种类型,它们的数量可变并且以不同的顺序给出。
这是否意味着printf
针对每种可能性都对函数进行了声明和覆盖?这对我来说意义不大,所以它真的像这样工作还是与众不同?
另外,该功能如何实现?如果太复杂了,我只想知道它在内部一般是如何工作的。
如何声明printf函数
printf是一个可变参数函数,自C99起它声明如下:
?int printf( const char *restrict format, ... ); ^^^
该...
或省略号表示有争论的可变号码,我们将使用的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); }