【问题标题】:Are functions with variadic arguments required to call va_start?调用 va_start 是否需要具有可变参数的函数?
【发布时间】:2021-02-02 23:12:48
【问题描述】:

在函数开始使用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_startva_end 之间返回会调用未定义的行为。在va_start 之前或va_end 之后返回都可以。
  • 考虑改用参数包。它是一种现代类型安全的替代方案。 Parameter pack

标签: c++ variadic-functions


【解决方案1】:

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

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

注意两点:

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

因此,va_start 调用也只有如果需要访问不同的参数是必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多