首页 > 解决方案 > 在 C++ 中,为什么 va_start 紧跟在 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()中间没有任何内容?这能达到什么目的?

标签: c++variadic-functions

解决方案


在 C++ 中,为什么 va_start 紧跟在 va_end 之后?

不知道。

为什么有人会创建一个可变参数函数,然后立即调用 va_start() ,然后调用 va_end() ,两者之间没有任何内容?

不知道,这没有多大意义。这就像编写int a;并且从不使用该变量。(可能是程序员心目中没有足够咖啡的迹象。)

这能达到什么目的?

没有什么。


您发布链接的完整功能提供了更多洞察力:

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

该功能与您提到的链接中的所有其他此类功能一样无效。调用vfprintf和使用vaafterva_end是未定义的行为。如果它是一个开放项目 - 帮助社区并通知开发人员。


推荐阅读