标题几乎完全涵盖了我的问题。对于某些上下文-从各种来源,我知道可变参数函数应该具有签名,其中第一个参数提供有关传递了多少个参数的信息,但是在反复试验之后,我发现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
作为参数,这是一个有效的假设吗?我找不到该列表应该以空值结尾,但也找不到相反的位置。
否,这不是有效的假设,即在最后一个参数处调用va_arg
将返回空指针。根据标准*,当没有剩余参数时,即指向最后一个参数时,调用va_arg
具有不确定的行为。据我所知,我无法检查程序是否在最后一个参数上,该信息必须以其他方式提供。
* C ++标准将va_arg
的行为引用到C标准,该标准在7.16.1.1节的第2节中对此进行了定义。