D模块名称由模块析构函数打印

时间:2012-01-12 18:02:22

标签: d tango d1

我最近开始使用Tango库学习D版本1。我决定编写一个包含Dout的小类tango.io.Stdout,除了它覆盖opShl以更好地匹配C ++的<<样式输出。我的实现是这样的:

// dout.d
module do.Dout;

import tango.io.Stdout;

class Dout
{
    public static Dout opShl(T) (T arg)
    {
        stdout(arg);
        return new Dout;
    }

    public static Dout newline()
    {
        stdout.newline;
        return new Dout;
    }
}

在主要内容中,我对Dout.opShl()进行了简单的调用,就像这样。

// main.d
import do.Dout;
import tango.io.Console;

int main(char[][] argv)
{
    Dout << "Hello" << " world!" << Dout.newline;
    Cin.get();
    return 0;
}

这样可行,但在按下进入和退出主菜单后,将打印文本“do.Dout.Dout”。单步执行代码后,我发现该文本打印在汇编指令中:

00406B5C call __moduleDtor (40626Ch)

在哪个do.Dout的析构函数被调用。

我的问题是,为什么在退出main时打印模块名称,我该怎么做才能阻止这种行为?

1 个答案:

答案 0 :(得分:3)

打印“do.Dout.Dout”的原因是因为Dout << Dout.newline;打印了一个新行(在newline属性调用中),然后尝试打印一个人类可读的字符串{{1 object(在传递给Dout之后)

你只能在销毁期间看到它,因为那时输出被刷新;)

你应该做的

opShl!Dout()

更接近C风格(Dout是一个全局对象而不会重新创建每次调用,换行是一个特殊的结构,除了向其添加换行符之外还刷新输出)