在 C++ 中,为什么 va_start 紧接着 va_end?

In C++ why have va_start immediately followed by va_end?

我在尝试阅读和理解的项目中的几个函数中看到以下代码:

void Algo::descend(const enc_node* node, const char* option, ...)
{
    ...
    va_list va;
    va_start(va, option);
    va_end(va);
    ...
}

我原则上理解可变参数函数,但为什么有人会创建一个可变参数函数,然后调用 va_start(),然后立即调用 va_end(),中间什么都没有?这有什么作用?

In C++ why have va_start immediately followed by va_end?

不知道。

why would someone make a variadic function and then call va_start() followed immediately by va_end() with nothing in between?

不知道,这没有多大意义。这就像写 int a; 而从不使用该变量。 (可能是程序员头脑中咖啡不够的标志。)

What does this achieve?

没有。


您发布 link 以提供更多见解的完整功能:

void Algo::descend(const enc_node* node, const char* option, ...)
{
  if (logdebug_enabled(LogEncoder)) {
    descendLevel++;
    printf("%d ",descendLevel);
    for (int i=0;i<descendLevel;i++) { printf(" "); }

    va_list va;
    va_start(va, option);
    va_end(va);

    fprintf(stdout, ">%s(", name());
    vfprintf(stdout, option, va);
    fprintf(stdout, ") %d;%d %dx%d %p\n",node->x,node->y,1<<node->log2Size,1<<node->log2Size,node);
  }
}

该函数与 the link you mentioned 中的所有其他此类函数一样无效。在 va_end 之后调用 vfprintf 并使用 va 是未定义的行为。如果它是一个开放项目 - 帮助社区并通知开发人员。