如何在 C 中使用 va_list 不存在额外参数时设置默认值

Ove*_*ave 6 c variadic-functions

我在尝试编写一个在没有给出额外参数的情况下具有默认值的函数时遇到了问题。我试过检测给定的唯一参数是否等于 NULL(如其他答案中所建议的那样),但它似乎对我不起作用。

该函数的实际实现采用一个结构并将其添加到第二个参数中给出的链表中。如果没有给出第二个参数,我希望它将它添加到先前定义的默认全局链表中。

下面是一个使用 int 类型参数的更简单的版本,但我想要做的原理是一样的:

/* appropriate headers... */

void test(int a, ... ) {

   int b;

   va_list args;
   va_start(args,a);

   b = va_arg(args,int);

   if (b == NULL) { // check if no argument is given and set default value
       b = 0; 
   } // if b != NULL then it should be set to the value of the argument
   va_end(args);

   printf("%d %d\n",a,b);
}

int main() {
   test(1);
   test(1,1);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,这给出了输出:

1 *random memory address*
1 1
Run Code Online (Sandbox Code Playgroud)

我想要的输出应该有第一行

1 0
Run Code Online (Sandbox Code Playgroud)

如果我不能使用这种方法,那么有没有人知道如何实现我想要的?提前致谢。

Sti*_*sis 5

没有办法只用va_list.

您可以使用宏并__VA_ARGS__强制某个参数作为“终止符”出现在参数列表的最后。IE:

#define TEST(a, ...) Test(a, __VA_ARGS__, 0)
Run Code Online (Sandbox Code Playgroud)

请注意,我使用的是 Visual C++。其他编译器的实现可能__VA_ARGS__略有不同,因此您可能需要调整实现。