![](/img/trans.png)
[英]How to use assembly to write a console(or just like printf() function) in uboot before set up C environment?
[英]C: how to write a function like printf
我学会了使用库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
真正使用参数之前,它已经计算了之前的参数数量(通过计算第一个字符串中的数字%)。 但同样,我认为这个解决方案有点效率不高。 它必须通过三个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
请帮我解释一下上面两个问题。
1)你自己回答了这个问题 - printf
必须解析格式字符串以决定在va_list中要采用多少个参数。
2)当它解析格式列表时,它将跟踪格式列表中指定的参数类型,并使用适当的类型调用var_arg
。
另请参阅 - 有趣的东西是在vfprintf()
,这里是链接源,尽管可能有更易读(如果效率更低)的版本 。
编辑:有便携式实施方案的snprintf的位置 ,看起来更具有可读性(这里找到正在寻找的snprintf C源代码() )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.