【问题标题】:D Module Name Being Printed by Module DestructorD 模块名称被模块析构函数打印
【发布时间】:2012-01-12 18:02:21
【问题描述】:

我最近开始使用 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;
    }
}

在 main 中,我像这样简单地调用了 Dout.opShl()。

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

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

这可行,但在按下回车键并退出 main 后,会打印文本“do.Dout.Dout”。单步执行代码后,发现汇编指令处打印了这段文字:

00406B5C call __moduleDtor (40626Ch)

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

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

【问题讨论】:

  • 离题,但仍然相关 - D1 不会进一步开发。 D 版本 2 是未来,如果你想学习 D,我衷心推荐你选择那个版本。有一个项目将 Tango 移植到 D2,所以我想你花在学习 Tango 上的时间不会浪费时间。
  • 真;我决定使用 D1,因为我想使用 Tango 而不是 Phobos;来自 C++ 背景,我认为 Tango 会更接近。等 D2 稳定下来,我肯定会换的。
  • 虽然这可能很有趣,但不要为标准输出重载左移运算符。 D1 也将开发到 2013 年。
  • @he_the_great 我意识到这在实际代码中是一件坏事。我只是在玩耍,感受一下 D 的运算符重载。

标签: d tango d1


【解决方案1】:

打印“do.Dout.Dout”的原因是因为Dout &lt;&lt; Dout.newline; 打印了一个新行(在newline 属性调用中),然后尝试打印Dout 对象的人类可读字符串(在它之后传递给opShl!Dout())

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

你应该做的

__gshared Doutclass Dout = new Doutclass;

class Doutclass
{
    public Dout opShl(T) (T arg)
    {
        static if(T == NLine){
            stdout.newline;//if nl is passed do newline
        }else{
            stdout(arg);
        }
        return this;
    }

    struct NLine{}//this might need a dummy field to stop compiler complaints
    public static NLine newline()
    {
        return NLine();
    }
}

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多