C语言 将省略号传递给另一个可变参数函数[重复]

lrl1mhuk  于 2023-08-03  发布在  其他
关注(0)|答案(4)|浏览(143)

此问题在此处已有答案

Forward an invocation of a variadic function in C(13个答案)
9年前关闭。
我有大约30个变量函数。每一个都接受一个路径作为最终参数,例如:

  1. bool do_foo(struct *f, int q, const char *fmt, ...)

字符串
在每个函数中,我必须检查扩展格式是否小于或等于某个大小。因此,我发现自己复制/粘贴了相同的代码块来检查vsnprintf()没有打印多少字符,相应地设置errno并退出写入。
我想做的是写一个函数来做这件事,它将返回一个静态分配(扩展)的字符串,已知是一个安全的大小,或新初始化的字符串失败,可以检查是否为NULL。检查还必须确定字符串是绝对路径还是相对路径,这会影响字符串的安全大小。有很多重复的代码,而且已经开始发臭了。
有没有一种方法可以将elipsis的内容从函数的入口传递到另一个函数?还是必须先调用va_start(),然后将va_list传递给helper函数?

编辑:

我并不反对将va_list传递给helper,我只是想确保没有其他东西存在。在我看来,编译器理解变量参数从哪里开始,所以我只是好奇,我是否可以告诉它沿着。

hl0ma9xz

hl0ma9xz1#

不能,只能将参数作为va_list传递。参见comp.lang.c FAQ
一般来说,如果你用C编写可变参数函数(即接受可变数量参数的函数),你应该为每个函数编写两个版本:一个采用省略号(...),另一个采用va_list。带有省略号的版本应该调用va_start,调用带有va_list的版本,调用va_end,然后返回。两个版本的函数之间不需要重复代码,因为一个调用另一个。
一个简单的用例可能是:

  1. int vadd(int num_count, va_list args) {
  2. int sum = 0;
  3. for(int k = 0; k < num_count; k++) {
  4. sum += va_arg(args, int);
  5. }
  6. return sum;
  7. }
  8. int add(int num_count, ...) {
  9. va_list args;
  10. int sum = 0;
  11. va_start(args, num_count);
  12. sum = vadd(num_count, args);
  13. va_end(args);
  14. return sum;
  15. }

字符串

展开查看全部
mwg9r5ms

mwg9r5ms2#

也许你可以使用variadic宏-像这样:

  1. #define FOO(...) do { do_some_checks; myfun(__VA_ARGS__); } while (0)

字符串

**注意!**Variadic宏仅适用于C99

hm2xizp9

hm2xizp93#

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

  1. #include <stdio.h>
  2. void print_vars(int *n)
  3. {
  4. int i;
  5. for(i=0;i<=*n;i++)
  6. printf("%X %d ", (int)(n+i), *(n+i));
  7. printf("\n");
  8. }
  9. void pass_vars(int n, ...)
  10. {
  11. print_vars(&n);
  12. }
  13. int main()
  14. {
  15. pass_vars(4, 6, 7, 8, 0);
  16. return 0;
  17. }

字符串
在我的pc上它输出

  1. $ ./a.out
  2. BFFEB0B0 4 BFFEB0B4 6 BFFEB0B8 7 BFFEB0BC 8 BFFEB0C0 0

展开查看全部
0tdrvxhp

0tdrvxhp4#

你必须将va_list传递给helper。

相关问题