D Core.vararg问题,重复调用va_arg时产生的垃圾

D Core.vararg问题,重复调用va_arg时产生的垃圾,d,variadic-functions,void-pointers,D,Variadic Functions,Void Pointers,请参阅以下代码: 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)); } } 如您所见,va

请参阅以下代码:

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));
    }
}
如您所见,var_arg正在生成垃圾。但是,第一次调用总是返回正确的值


这里怎么了?core.vararg的源代码非常简单,我无法发现任何更改7FFF61F21AE0处基础数据的内容,7FFF61F21AE0看起来像一个64位地址。请注意,对于X86以外的平台,
core.vararg
将其实现转发到
core.stdc.stdarg

64位实现如下所示:


对于示例中的代码,最明显的解释是模块使用不正确(我想是no
va_start
call)。

Ah,我明白了。我认为使用core.vararg不需要调用va_start(这里的示例中没有任何调用:)。但是,对于core.stdc.stdarg,这一定是meNo发生的事情,无论我做什么,无论是使用x86或x86_64编译,还是使用任何一种语法,指针都保持在相同的地址上,但是va_arg按顺序读取参数,然后移动到垃圾中,尽管使用了va_copy。
7FFF61F21AE0 1
7FFF61F21AE0 0
7FFF61F21AE0 4387892
7FFF61F21AE0 0
7FFF61F21AE0 38
7FFF61F21AE0 1643256688
7FFF61F21AE0 4387915
7FFF61F21AE0 1
7FFF61F21AE0 27734032
7FFF61F21AE0 1005847240