请谈谈函数参数列表

hbzx 2003-08-24 08:51:17
象这样的参数列表
是C里的还是C++里的?怎么用?
下面例子里的va_listap和va_start()又是什么意思?
请高手指教。谢谢!!


int myprintf(const char *fmt, ...)
{
const char *s;
int d;
char buf[16];
va_listap;
va_start(ap, fmt);
while (*fmt) {
if (*fmt != ’%’) {
putchar(*fmt++);
continue;
}
switch (*++fmt) {
case ’s’:
s = va_arg(ap, const char *);
for ( ; *s; s++) {
putchar(*s);
}
break;
case ’d’:
d = va_arg(ap, int);
itoa(d, buf, 10);
for (s = buf; *s; s++) {
putchar(*s);
}
break;
/* Add other specifiers here... */
default:
putchar(*fmt);
break;
}
fmt++;
}
va_end(ap);
return 1; /* Dummy return value */
}
...全文
71 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbzx 2003-08-25
  • 打赏
  • 举报
回复
挺复杂的啊,而且感觉这个东西跟C语言的风格不相符>_<!
wbh0360 2003-08-24
  • 打赏
  • 举报
回复
都有这样的函数,printf啊,就是个变参的函数嘛
Caoyu015 2003-08-24
  • 打赏
  • 举报
回复
C和C++中都有这种参数列表,这是表示函数接受的参数个数是可变的.
不但是C/C++中有这样的变长参数,在很多的语言中都有这种接受参数数目为可变的函数,
例如C#中的 System.Console.Write() 函数也是。

va_start()和va_end()函数是成对的使用,它们是用于实现不定长参数这种功能的关键。
va_arg()是用于获得栈中的下一个参数。

va_list ap这种类型类似与记录当前的栈地址之类的指针。
csdn5211 2003-08-24
  • 打赏
  • 举报
回复
c里好像没有const吧?
jp311 2003-08-24
  • 打赏
  • 举报
回复
关于可变参数的问题
《the c programming language (2nd edition)》讲的比较清楚
chengsion 2003-08-24
  • 打赏
  • 举报
回复
C/C++都可以
比如 C里的printf( )也是参数可变 的函数
qiuyepiao 2003-08-24
  • 打赏
  • 举报
回复
呵呵 ,学习。长知识啊
loyyer 2003-08-24
  • 打赏
  • 举报
回复
1、C++,C没有const;一样的用,只是const起保护参数的作用。
2、不知道(对不起)
紫郢剑侠 2003-08-24
  • 打赏
  • 举报
回复
C/C++都可以.
va_listap应该是个宏
va_start()是前面定义的函数或宏;
jack_wq 2003-08-24
  • 打赏
  • 举报
回复
C/C++都可以,这是一个参数个数可变的例子!
danielhf 2003-08-24
  • 打赏
  • 举报
回复
1。查看stdarg.h里的宏定义。
2。参看MSDN里的va_list的示例代码。
riverboat 2003-08-24
  • 打赏
  • 举报
回复
好像是一组相关的用于定义可变数目参数函数的宏。具体可以看相关头文件的定义。

可变参数函数虽然听起来很酷,不过由于参数在编译阶段不能充分利用编译器的类型检查,完全要自己掌握,所以。。。
而且现在由于面向对象编程深入人心以及C++函数方便的重载,已经很少使用了(我一直没有用过,以前稍微研究了一下编了两个玩玩,呵呵)。

编起来倒是不难,照着上面的例子写就行了,很多C语言入门的书上也都有。没准帮助里就会有,呵呵,自己找找吧。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧