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