可变参数函数在某些情况下参数顺序错误

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() 函数的每个参数。