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)
是什么导致了这种意外行为
不保证编译器按顺序评估参数.添加一些其他局部变量并按顺序执行这两个分配.
看到这个其他堆栈溢出发布.
int v1 = va_arg(vl, int);
int v2 = va_arg(vl, int);
label->SetPosition(v1, v2);
Run Code Online (Sandbox Code Playgroud)
为了让您在观察什么:完全相同的值的两倍 - 可能需要堆在评估情况,或在您的环境的va_arg特定宏扩展的一些娱乐方面的不确定秩序之上的编译错误.
va_arg是一个宏.隐藏在宏之后的是实现定义,这意味着执行的操作很可能va_arg具有副作用.因此,va_arg在两个相邻序列点之间不止一次使用并不是一个好主意.这可能是未定义的行为,这意味着任何事情都可能发生.看起来这正是你的情况下发生的事情,当你从中得到两个相同的值时会导致这种"奇怪"的行为va_arg.
即使在某些实现中没有未定义的行为,函数调用中的参数评估顺序也是未指定的,这意味着在使用它们的方式中使用任何"顺序读取器"并不能保证按预期工作(无论您的意图是什么) .