C 中的可变参数函数比 stdarg 更好吗?

Ran*_*Ran 0 c variadic variadic-functions

我希望在 C 中创建一个可变参数函数,允许执行如下操作:

Send({1,2,3,4,5});
Send({4,5,2});
Send({1,1,1,1,1,1,1,1,1,1,1,1,1});
Run Code Online (Sandbox Code Playgroud)

请注意,没有长度输入,并且数组是内联放置的,并且没有任何设置或创建任何变量

目前我正在使用正式的可变参数选项,如下所示(来自此处的示例),这非常方便,但也容易出现有时难以调试的错误,例如忘记放置num_args(仍然编译)、放置错误数量的元素等。

int sum(int num_args, ...) {
   int val = 0;
   va_list ap;
   int i;

   va_start(ap, num_args);
   for(i = 0; i < num_args; i++) {
      val += va_arg(ap, int);
   }
   va_end(ap);
 
   return val;
}
Run Code Online (Sandbox Code Playgroud)

M O*_*ehm 5

定义对任意数量的相同类型参数进行操作的函数的典型方法是使用数组:

int sum(const int array[], size_t n)
{
    int sum = 0;
    
    while (n--) sum += array[n];
    
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

这意味着您必须为每次调用创建一个辅助数组并调用该函数,也许使用一个用于确定数组及其第一个成员的大小的countof宏。sizeof

从 C99 开始,您可以使用复合文字来创建此类数组:

int s = sum((int[]){1, 1, 2, 3, 5}, 5);
Run Code Online (Sandbox Code Playgroud)

这对于数组元素来说可能更方便且类型安全,但仍然存在计数错误的危险。

您可以使用可变参数宏来组合复合文字和countof习惯用法:

#define SUM(...) sum((int[]){__VA_ARGS__},    \
    sizeof((int[]){__VA_ARGS__}) / sizeof(int))
Run Code Online (Sandbox Code Playgroud)

sizeof(只会评估 的复合文字参数的大小。)

像这样使用它:

printf("%d\n", SUM(1, 2, 3, 4, 5));
printf("%d\n", SUM(200.0, 30.0, 5.0));
printf("%d\n", SUM());
Run Code Online (Sandbox Code Playgroud)

(不过,我不确定这样的宏是否有用。这个sum例子充其量是人为的:sum(a, b, c)可以写成a + b + c。也许用于两个以上参数的 aminmax宏可能有用。一般来说,我发现我有数据当我在 C 中工作时,我已经想要数组形式了。)