可变参数列表是否以空值结尾?

The*_*ind 2 c++ variadic-functions

标题几乎完全涵盖了我的问题。对于某些上下文 - 从各种来源我知道可变参数函数应该有签名,其中第一个参数提供有关传递了多少参数的信息,但是在玩弄它之后我发现它vs_arg总是nullptr在最后一个参数之后立即返回所以这段代码效果很好(使用 MS Visual Studio):

void func(MClass *t_instance...) {
    std::va_list arguments;
    va_start(arguments, t_instance);
    for (MClass *instance = t_instance; instance != nullptr; instance = va_arg(arguments, MClass *)) {
        std::out << instance->name << std::endl;
    }
    va_end(arguments);
}
Run Code Online (Sandbox Code Playgroud)

当然,如果没有nullptr作为参数传递,这是一个有效的假设吗?我找不到这个列表应该是空终止的,但也找不到相反的。

Joh*_*han 5

不,va_arg在最后一个参数上调用将返回空指针不是一个有效的假设。根据标准*调用,va_arg当没有剩余参数时,即当它指向最后一个参数时,具有未定义的行为。据我所知,程序无法检查它何时处于最后一个参数,必须通过其他方式提供此信息。

* C++ 标准指的va_arg是 C 标准的行为,C 标准在第 7.16.1.1 节第 2 节中对此进行了定义。