免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2259 | 回复: 13
打印 上一主题 下一主题

[C] 请教,c语言中的可变参数问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-27 10:40 |只看该作者 |倒序浏览
看下面这个程序,现在是编译不过,怎么写是正确的呢

#include <stdio.h>
#include <stdarg.h>

void func1(int x, ...)
{
va_list dp;
int i;
int d;

va_start(dp, x);

for (i=0; i<x; i++)
{
d = va_arg(dp, int);
printf("%d\n", d);
}
va_end(dp);
}

void func2(int x, ...)
{
func1(x, ...);
}

int main(int argc, char *argv[])
{
func2(3, 1, 2, 3);
return 0;
}

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2006-09-27 10:44 |只看该作者
你见过有人像func1(x, ...);这样调用一个函数的吗?

论坛徽章:
0
3 [报告]
发表于 2006-09-27 10:48 |只看该作者
去看printf的源码就知道了啊

论坛徽章:
0
4 [报告]
发表于 2006-09-27 10:49 |只看该作者
多写个FUN2干啥呢?是另有所想还是什么?
不清楚
void func2(int x, ...)
{
func1(x, ...);
}

论坛徽章:
0
5 [报告]
发表于 2006-09-27 11:08 |只看该作者
给楼主个参考:

  1. #include <stdio.h>
  2. #include <stdarg.h>

  3. void fun(char *fmt, ...)
  4. {
  5.         va_list ap;
  6.         char buffer[1024] = "";

  7.         va_start(ap, fmt);
  8.         int n = vsnprintf(buffer, sizeof(buffer)-1, fmt, ap);
  9.         buffer[n] = '\0';
  10.         va_end(ap);

  11.         printf("%s\n", buffer);

  12.         return ;
  13. }

  14. int main()
  15. {
  16.         int i = 150, j = -100;
  17.         double k = 3.14159;

  18.         fun("j=%d k=%f i=%x\n", j, k, i);

  19.         return 0;
  20. }

复制代码

论坛徽章:
0
6 [报告]
发表于 2006-09-27 11:27 |只看该作者
感谢各位,尤其是5楼。

不过,我的问题各位都没解决,

func1函数已经是完成功能的,现在需要再写一个函数func2(当然是有需求的),
在func2中如何调用func1是我的问题。

2楼说没见过我写的这种方式,这是当然的,因为我写这样的错误的写法,就是想请你帮忙改正的。

论坛徽章:
0
7 [报告]
发表于 2006-09-27 11:36 |只看该作者
原帖由 bzimage 于 2006-9-27 11:27 发表
感谢各位,尤其是5楼。

不过,我的问题各位都没解决,

func1函数已经是完成功能的,现在需要再写一个函数func2(当然是有需求的),
在func2中如何调用func1是我的问题。

2楼说没见过我写的这种方式,这 ...

楼主是要在func2中除了完成func1的各功能外还要做其它的吧,那为什么不在main里调用func1,在func1里调用func2而完成其它呢

论坛徽章:
0
8 [报告]
发表于 2006-09-27 11:49 |只看该作者
func1支持可变参数,但在调用的时候就要给出明确的参数了,你在func2中调用,所以要给明确的参数,不能说func2也是可变参数,然后把func2的可变参数给func1。这种调用是错误的!

论坛徽章:
0
9 [报告]
发表于 2006-09-27 13:07 |只看该作者
  1. void func1(int x ,va_list ap)
  2. {

  3. }
  4. void func2(int x, ...)
  5. {
  6. va_list ap;
  7. va_start(ap, x);
  8. func1(x, ap);
  9. va_end(ap);
  10. }
复制代码

func1修改一下

[ 本帖最后由 gawk 于 2006-9-27 13:27 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-09-27 13:18 |只看该作者
这样改一下试试
  1. void func1(int x, va_list dp)
  2. {
  3. int i;
  4. int d;

  5. for (i=0; i<x; i++)
  6. {
  7. d = va_arg(dp, int);
  8. printf("%d\n", d);
  9. }

  10. }

  11. void func2(int x, ...)
  12. {
  13. valist dp;
  14. va_start(dp,x);
  15. func1(x, dp);
  16. va_end(dp);
  17. }
复制代码

[ 本帖最后由 gawk 于 2006-9-27 19:28 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP