将va_arg两次传递给相同值的函数结果

Zoo*_*tor 1 c++ variadic-functions

我正在尝试使用va_arg在我的GUI库中创建一个通用工厂函数.在同一函数中传递va_arg两次时,它们传递相同的值而不是两个不同的值:

GUIObject* factory(enumGUIType type, GUIObject* parent, ...){
   va_list vl;
   va_start(vl, parent);
   ...
   label->SetPosition(va_arg(vl, int), va_arg(vl, int));
   va_end(vl);
   return finalObjectPointer;
}

factory(LABEL, theParent, 100,200); // Results in position 200:200
Run Code Online (Sandbox Code Playgroud)

是什么导致了这种意外行为

bma*_*ies 6

不保证编译器按顺序评估参数.添加一些其他局部变量并按顺序执行这两个分配.

看到这个其他堆栈溢出发布.

int v1 = va_arg(vl, int);
int v2 = va_arg(vl, int);

label->SetPosition(v1, v2);
Run Code Online (Sandbox Code Playgroud)

为了让您在观察什么:完全相同的值的两倍 - 可能需要堆在评估情况,或在您的环境的va_arg特定宏扩展的一些娱乐方面的不确定秩序之上的编译错误.


AnT*_*AnT 6

va_arg是一个宏.隐藏在宏之后的是实现定义,这意味着执行的操作很可能va_arg具有副作用.因此,va_arg在两个相邻序列点之间不止一次使用并不是一个好主意.这可能是未定义的行为,这意味着任何事情都可能发生.看起来这正是你的情况下发生的事情,当你从中得到两个相同的值时会导致这种"奇怪"的行为va_arg.

即使在某些实现中没有未定义的行为,函数调用中的参数评估顺序也是未指定的,这意味着在使用它们的方式中使用任何"顺序读取器"并不能保证按预期工作(无论您的意图是什么) .