代码之家  ›  专栏  ›  技术社区  ›  Tim Post Samir J M Araujo

将省略号传递给另一个变量函数[复制]

  •  75
  • Tim Post Samir J M Araujo  · 技术社区  · 17 年前

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

    在每个函数中,我必须检查扩展格式是否小于或等于特定大小。因此,我发现自己复制/粘贴了相同的代码块,以检查有多少个字符 vsnprintf() errno

    va_start() va_list 辅助功能?

    va_list 对于助手来说,我只是想确保没有其他东西存在。在我看来,编译器理解变量参数从哪里开始,所以我只是好奇是否可以告诉它传递它们。

    4 回复  |  直到 13 年前
        1
  •  75
  •   Mehdi Charife    2 年前

    va_list comp.lang.c FAQ .

    一般来说,如果你在C中编写可变参数函数(即接受可变数量参数的函数),你应该为每个函数编写两个版本:一个接受省略号( ... va_list .带省略号的版本应调用 va_start va_list va_end

    一个简单的用例可能是:

    int vadd(int num_count, va_list args) {
        int sum = 0;
        for(int k = 0; k < num_count; k++) {
            sum += va_arg(args, int);
        }
    
        return sum;
    }
    
    int add(int num_count, ...) {
        va_list args;
        int sum = 0;
    
        va_start(args, num_count);
        sum = vadd(num_count, args);
        va_end(args);
    
        return sum;
    }
    
        2
  •  12
  •   qrdl    17 年前

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

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

    NB!

        3
  •  1
  •   Sepero    13 年前

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

    #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;
    }
    

    $ ./a.out
    BFFEB0B0 4  BFFEB0B4 6  BFFEB0B8 7  BFFEB0BC 8  BFFEB0C0 0
    
        4
  •  0
  •   Andrew Grant    17 年前

    您必须将va_list传递给助手。