首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将省略号传递给另一个可变函数

将省略号传递给另一个可变函数
EN

Stack Overflow用户
提问于 2009-03-30 04:10:14
回答 4查看 38.1K关注 0票数 71

我有大约30个可变函数。每个参数都接受一个路径作为最后一个参数,例如:

代码语言:javascript
复制
bool do_foo(struct *f, int q, const char *fmt, ...)

在每个函数中,我必须检查扩展后的格式是否小于或等于某个特定的大小。因此,我发现自己复制/粘贴了相同的代码块来检查vsnprintf()没有打印多少字符,并相应地设置errno,然后退出编写。

我想要做的是写一个函数来做这件事,它将返回一个已知为安全大小的静态分配的(扩展的)字符串,或者在失败时返回新初始化的字符串,可以根据NULL进行检查。检查还必须确定字符串是绝对路径还是相对路径,这会影响字符串的安全大小。它有很多重复的代码,而且开始有异味了。

有没有一种方法可以将elipsis的内容从我的函数的入口传递到另一个函数?或者我必须先调用va_start(),然后再将va_list传递给助手函数?

编辑:

我根本不反对将va_list传递给帮助器,我只是想确保没有其他东西存在。在我看来,编译器似乎知道可变参数从哪里开始,所以我很好奇是否可以告诉它传递这些参数。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-03-30 04:21:19

您不能,您只能将参数作为va_list传递。请参阅comp.lang.c FAQ

通常,如果您正在用C语言编写可变函数(即接受可变数量参数的函数),则应该为每个函数编写两个版本:一个接受省略号(...),另一个接受va_list。带省略号的版本应该调用va_start,调用带va_list的版本,调用va_end,然后返回。不需要在函数的两个版本之间重复代码,因为一个版本调用另一个版本。

票数 71
EN

Stack Overflow用户

发布于 2009-03-30 06:00:04

也许你可以使用可变的宏-就像这样:

代码语言:javascript
复制
#define FOO(...)  do { do_some_checks; myfun(__VA_ARGS__); } while (0)

NB!变量宏仅适用于C99

票数 12
EN

Stack Overflow用户

发布于 2012-06-01 12:53:19

我不知道这是否有用,你可以通过引用来访问变量。这是一种偷偷摸摸的技巧,但不幸的是,它不允许您在最终的函数定义中使用省略号。

代码语言:javascript
复制
#include <stdio.h>

void print_vars(int *n)
{
  int i;
  for(i=0;i<=*n;i++)
    printf("%X %d  ", (int)(n+i), *(n+i));
  printf("\n");
}

void pass_vars(int n, ...)
{
  print_vars(&n);
}

int main()
{
    pass_vars(4, 6, 7, 8, 0);
    return 0;
}

在我的pc上,它输出

代码语言:javascript
复制
$ ./a.out
BFFEB0B0 4  BFFEB0B4 6  BFFEB0B8 7  BFFEB0BC 8  BFFEB0C0 0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/695982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档