可变参数列表是否为空终止?

问题描述 投票:0回答:1

标题几乎完全涵盖了我的问题。对于某些上下文-从各种来源,我知道可变参数函数应该具有签名,其中第一个参数提供有关传递了多少个参数的信息,但是在反复试验之后,我发现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);
}

当然,只要没有传递nullptr作为参数,这是一个有效的假设吗?我找不到该列表应该以空值结尾,但也找不到相反的位置。

c++ variadic-functions
1个回答
3
投票

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

* C ++标准将va_arg的行为引用到C标准,该标准在7.16.1.1节的第2节中对此进行了定义。

© www.soinside.com 2019 - 2024. All rights reserved.