jemmy 发表于 2010-1-5 11:15:54

请教:关于44b0 的44blib.c 中的Uart_Printf()函数参数的疑惑

如题。
函数具体如下,不太理解其输入参数,特别是那3 个点,怎么会有这样的参数,奇怪怎么编译不报错的呢?

void Uart_Printf(char *fmt,...)
{
    va_list ap;
    char string;

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    Uart_SendString(string);
    va_end(ap);
}

另外,在调用时,是常见的方式是在双引号里填入要输出的内容,比较好理解,如下:
Uart_Printf("abcdefg");

但也有传入多个参数的,这个不太理解,如下:
Uart_Printf("%2d:%s",i+1,function);

这里提到的程序都是在立宇泰的timer test例程中复制出来的。期待哪位兄弟能帮忙解释一下,不胜感激。

snoopyzz 发表于 2010-1-5 11:36:12

格式化参数输入

snoopyzz 发表于 2010-1-5 11:37:05

LZ没学过C语言吧?

jemmy 发表于 2010-1-5 11:48:27

c语言学过,不过第一次见到用几个点作为参数的。
我知道后面那里的2d和s是代表格式,但不明白"*format,..."那里到底传了多少个参数。
关于这里的格式化参数输入,LS能不能说得稍微详细一点。

xuxi2009 发表于 2010-1-5 11:56:48

这个叫参数数量可变的函数,要不你用C语言的printf时怎么可以有任意个%形式的格式化输出呢

jemmy 发表于 2010-1-5 11:59:16

4楼的意思是说,那3个点表示参数的数量是可以变的?
如果是这样的话,就明白多了。

jemmy 发表于 2010-1-5 12:03:43

谢谢4楼的提醒,在网上查了,确实是C中的参数个数可变函数。

xuxi2009 发表于 2010-1-5 12:04:45

c语言中的printf函数也是这么实现的,你可以查看一下stdio.h文件中该函数的定义,主要是靠va_start和va_end对输入数据进行处理和整合

xuxi2009 发表于 2010-1-5 12:07:57

这个地方不用细究,反正是c的一个功能,一般c的书的最后几章内容都有对该函数的介绍,比如谭浩强,呵呵

jemmy 发表于 2010-1-5 12:13:29

呵呵,我们当时大学的课程就是谭浩强的C语言,不过由于课时的原因,连指针都没怎么讲,就结束课程,期末考试了。
我只是在timer test的例程看到有这样的东西,在ucos的printf函数也看到有这样的东西,有些好奇,所以去了解一下。

huangtonggao 发表于 2010-10-15 10:35:26

学习了
页: [1]
查看完整版本: 请教:关于44b0 的44blib.c 中的Uart_Printf()函数参数的疑惑