Variadi c функции аргументы неправильный порядок в некоторых случаях - PullRequest
0 голосов
/ 07 августа 2020

Я пытался сократить свой код и обнаружил что-то странное с функциями Variadi c (скорее всего, из-за моего незнания) 1003 *

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);
}

, а затем этот фрагмент кода, который меняет порядок аргументов

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);
}

Теперь я боюсь, что первый фрагмент кода сработал каким-то чудом, может кто-то может мне помочь чтобы понять, что происходит?

1 Ответ

4 голосов
/ 07 августа 2020

Первая версия верна. Операторы выполняются по порядку, поэтому вы можете быть уверены, что первый аргумент вариади c будет присвоен modKey, а второй - key.

Вторая версия зависит от неопределенного поведения . Относительный порядок оценки аргументов функции не указан. Таким образом, он может сначала вычислить любое выражение va_arg(), что означает, что он может назначить неправильный аргумент вариа c каждому параметру функции textType().

...