1

请看以下代码:

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 基础数据的东西

4

1 回答 1

2

7FFF61F21AE0看起来像一个 64 位地址。请注意,core.vararg将其实现转发到core.stdc.stdargX86 以外的平台。

64位实现在这里:https ://github.com/D-Programming-Language/druntime/blob/master/src/core/stdc/stdarg.d#L84

我认为示例中代码的明显解释是模块使用不正确(没有va_start调用)。

于 2012-07-11T13:11:22.630 回答