gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:01:38 25 4
gpt4 key购买 nike

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

这可行,但在按下回车键并退出 main 后,会打印文本“do.Dout.Dout”。单步执行代码后,我发现在汇编指令处打印了这段文字:
00406B5C call __moduleDtor (40626Ch)
其中 do.Dout 的析构函数被调用。

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

最佳答案

打印“do.Dout.Dout”的原因是因为Dout << 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 是一个全局对象,每次调用都不会重新创建,换行符是一个特殊的结构,除了添加换行符之外还刷新输出)

关于D 模块名称被模块析构函数打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8839949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com