请参阅以下代码:
import core.vararg, std.stdio;
void main() {
foo(1);
}
void foo(...) {
va_list arguments;
for(int i; i<10; ++i) {
va_copy(arguments, _argptr);
writeln(arguments," ", va_arg!(int)(arguments));
}
}
输出:
7FFF61F21AE0 1
7FFF61F21AE0 0
7FFF61F21AE0 4387892
7FFF61F21AE0 0
7FFF61F21AE0 38
7FFF61F21AE0 1643256688
7FFF61F21AE0 4387915
7FFF61F21AE0 1
7FFF61F21AE0 27734032
7FFF61F21AE0 1005847240
如您所见,var_arg正在产生垃圾。第一个调用总是返回正确的值。
这里有什么问题? core.vararg的源代码非常简单,我无法发现任何改变7FFF61F21AE0底层数据的内容
答案 0 :(得分:2)
7FFF61F21AE0
看起来像是64位地址。请注意,对于X86以外的平台,core.vararg
会将其实施转发给core.stdc.stdarg
。
64位实现在这里:https://github.com/D-Programming-Language/druntime/blob/master/src/core/stdc/stdarg.d#L84
我认为,示例中代码的明显解释是模块使用不正确(没有va_start
调用)。