我已经学会了使用库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);
}
基于上面的代码,我不知道如何printf
克服两个主要约束:
1)固定数量的参数:意思是,在几乎 vardiac 函数中,您需要包含 args 的数量。但是当我写的时候printf
,我不必包括这个数字。我认为在printf
真正使用参数之前,它已经计算了之前的参数数量(通过计算第一个字符串中的数字 % )。但同样,我认为这个解决方案有点效率不高。它必须经过三个阶段:计算参数的数量,并将这些参数放入堆栈,最后将所有参数放入屏幕。
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
请帮我解释一下以上两个问题。