调用 va_start 是否需要带有可变参数的函数?

问题描述

在开始使用 va_list 之前提前退出带有可变参数的函数是否安全?

#include <cstdarg>

int func(const char * format,...){
    if(format == NULL)
        return 0; // <-- exits before ackNowledging variadic parameters; is this okay?
    va_list params;
    va_start(params,format);

    // func body

    va_end(params);
    return stuff;
}

解决方法

是的,这是合法的。 ,函数不需要调用 va_start。来自 C99 标准:

如果需要访问不同的参数,被调用的函数 应声明一个对象...类型为 va_list。

请注意这里的两件事:

  1. va_listva_start 调用的先决条件。
  2. 只有在如果需要访问不同参数时才需要va_list

因此,只有需要访问不同的参数时,才需要调用 va_start