C++ 调用va_start是否需要具有可变参数的函数?

C++ 调用va_start是否需要具有可变参数的函数?,c++,variadic-functions,C++,Variadic Functions,在开始使用变量列表之前,提前退出带有可变参数的函数是否安全 #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, form

在开始使用变量列表之前,提前退出带有可变参数的函数是否安全

#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;
}
#包括
int func(常量字符*格式,…){
if(格式==NULL)

返回0;//,这是合法的。,函数不需要调用
va_start
。从C99标准:

如果需要访问可变参数,则调用的函数 应声明一个对象…具有类型va_列表

注意这里的两件事:

  • va_列表
    是调用
    va_启动
    的先决条件
  • 只有在需要访问各种参数时,才需要使用
    va_列表

  • 同样,只有在需要访问不同参数时,
    va_start
    调用才是必要的。就我所知,不要认为有任何理由阻止您在<代码> VAXSTATE/<代码>和<代码> VAYEXED>代码>之间返回未定义的行为。在“代码> VAYSTART 之前或在代码> VAXEDATE//C>之后返回。请考虑使用参数包。它是一种现代类型安全的替代品。