printf的原型和实现

kpa*_*cha 2 c variadic-functions

我开始想知道printf函数是如何声明的,它总是接收一个字符串作为第一个参数(好吧,const char*),然后其余参数可以是各种类型,它们的数量可变并且以不同的顺序给出。

这是否意味着printf针对每种可能性都对函数进行了声明和覆盖?这对我来说意义不大,所以它真的像这样工作还是与众不同?

另外,该功能如何实现?如果太复杂了,我只想知道它在内部一般是如何工作的。

Sha*_*our 5

如何声明printf函数

printf是一个可变参数函数,自C99起它声明如下:

?int printf( const char *restrict format, ... );
                                         ^^^
Run Code Online (Sandbox Code Playgroud)

...或省略号表示有争论的可变号码,我们将使用的va_start在va_argva_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)