C:如何编写像printf这样的函数

hqt*_*hqt 2 c variadic-functions

我学会了使用库stdarg.h来获取具有未知数量参数的函数.这是一个简单的函数如何使用:

void print(int args,...){
    va_list ap;
    va_start(ap, args);
    int i = 0;
    for(i=0; i<args; i++){
        printf("%d\n",va_arg(ap, int));
    }
    va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)

基于上面的代码,有两个主要的约束,我不知道如何printf 克服:

1)固定数量参数:意思是,在几乎vardiac函数中,你需要包含args的数量.但是当我写作时printf,我不必包括这个数字.我以为在printf真正使用参数之前,它已经计算了之前的参数数量(通过计算第一个字符串中的数字%).但同样,我认为这个解决方案有点效率不高.它必须通过三个pharses:计算参数数量,并将这些参数放入堆栈,最后将所有参数放入屏幕.

2)所有参数必须具有相同的类型: 如下所示:printf("%d\n",va_arg(ap, int));.因此,列表中的每个参数都必须具有相同的类型.而且正如我们所知,这不是printf中必须的.您可以使用整数或字符串打印double.如果我们将所有这些视为一个字符串,那么这一行应该是错误的,因为错误的语法:

printf("%d",4); //4 cannot treat by string
printf("%d",'4'); // :)) I think this line is better
Run Code Online (Sandbox Code Playgroud)

请帮我解释一下上面两个问题.

Joh*_*ter 8

1)您自己已经回答了这个问题 - printf必须解析格式字符串以确定在va_list中要采用的参数数量.

2)当它解析格式列表时,它将跟踪格式列表中指定的参数类型,并var_arg使用适当的类型进行调用.

- 有趣的东西在vfprintf(),这里是链接的源,虽然可能有更可读(如果效率较低)的版本.

编辑:有便携式实施方案的snprintf的位置,看起来更具有可读性(这里找到 正在寻找的snprintf C源代码() )