2012-08-12 45 views
2

我学会了使用函数库stdarg.h来使函数具有未知数量的参数。下面是一个简单的功能如何使用这个:有两个主要约束C:如何编写像printf这样的函数

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函数中,你需要包含一些参数。但是当我写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 

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

+0

http://www.gamedev.net/topic/386650-how-to-write-a-printf- like-function/ – 2012-08-12 10:05:30

+1

因为,正如你所看到的,printf不能通过这样的简单循环工作,为什么你对它施加约束只适用于这样一个简单的循环? – 2012-08-12 10:13:52

回答

8

1)您自己回答了问题 - printf必须解析格式字符串以决定在va_list中需要的参数数量。

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

另外see - 有趣的东西是在vfprintf(),这里是链接的源代码,虽然可能会有更易读(如果效率更低)version

编辑:有便携式实施方案的snprintf here的,看起来更具有可读性(这里Looking for C source code for snprintf()找到)

相关问题