可变参数函数在某些情况下参数顺序错误
Variadic functions arguments bad order in some cases
我试图减少我的代码,但我发现可变参数函数有些奇怪(不过这肯定是由于我缺乏知识)
所以我有一段有效的代码:
void Text::textTypePtr(Root* text, ...)
{
va_list args;
va_start(args, text);
Interact::ModifiedKey modKey = va_arg(args, Interact::ModifiedKey);
Keyboard::Key key = va_arg(args, Keyboard::Key);
static_cast<Text*>(text)->textType(modKey, key);
va_end(args);
}
然后,这段颠倒args顺序的代码
void Text::textTypePtr(Root* text, ...)
{
va_list args;
va_start(args, text);
static_cast<Text*>(text)->textType(va_arg(args, Interact::ModifiedKey), va_arg(args, Keyboard::Key));
va_end(args);
}
我现在害怕第一段代码奇迹般地工作,有人可以帮助我了解发生了什么吗?
第一个版本是正确的。语句按顺序执行,因此您可以确信第一个可变参数将分配给 modKey
,第二个将分配给 key
.
第二个版本取决于未指定的行为。函数参数求值的相对顺序是未指定的。所以它可以首先评估 va_arg()
表达式,这意味着它可以将错误的可变参数分配给 textType()
函数的每个参数。
我试图减少我的代码,但我发现可变参数函数有些奇怪(不过这肯定是由于我缺乏知识)
所以我有一段有效的代码:
void Text::textTypePtr(Root* text, ...)
{
va_list args;
va_start(args, text);
Interact::ModifiedKey modKey = va_arg(args, Interact::ModifiedKey);
Keyboard::Key key = va_arg(args, Keyboard::Key);
static_cast<Text*>(text)->textType(modKey, key);
va_end(args);
}
然后,这段颠倒args顺序的代码
void Text::textTypePtr(Root* text, ...)
{
va_list args;
va_start(args, text);
static_cast<Text*>(text)->textType(va_arg(args, Interact::ModifiedKey), va_arg(args, Keyboard::Key));
va_end(args);
}
我现在害怕第一段代码奇迹般地工作,有人可以帮助我了解发生了什么吗?
第一个版本是正确的。语句按顺序执行,因此您可以确信第一个可变参数将分配给 modKey
,第二个将分配给 key
.
第二个版本取决于未指定的行为。函数参数求值的相对顺序是未指定的。所以它可以首先评估 va_arg()
表达式,这意味着它可以将错误的可变参数分配给 textType()
函数的每个参数。