D源文件的混合模块和程序行为

4

Python源代码文件具有很好的特性,既可以作为模块使用,也可以使用模式作为独立程序(工具)。

if __name__ == "__main__":

是否有办法使D模块源文件具有相同的行为?

3个回答

6
(仅适用于Unix)
您可以使用一个shebang行来设置一个版本,从而启用一个主函数:
#!/path/to/rdmd --shebang -version=run
version(run) void main() {}

将您的文件设置为可执行 (chmod +x foo.d) 并像运行程序一样运行它 (./foo.d)。

请确保使用唯一的版本标识符(不像我在这里所做的那样)。也许以某种形式包含完全限定的模块名称,或者使用UUID。


5
这取决于您想要做什么。在 D 语言中,一个程序需要在所有模块中确切地有一个 main 函数作为入口点,因此没有像 Python 中那样隐式的方式。D 语言的方法是将可执行文件创建为包含 main 并导入其他模块的单独模块。
但是,如果您只是想进行测试,应该将可执行代码放入没有 mainunittest 块中,然后可以使用 rdmd -main -unittest scratch.d 运行该文件,它会为您添加一个存根 main
如果您真的想制作一个双重用途的模块(这不是真正的 D 语言方式),可以将 main 放在唯一的 version 块中。
module scratch; // file scratch.d
import std.stdio;

void foo(){ writeln("FOO"); }

version(scratchExe) {
    void main() {
        foo();
    }
}

然后使用 dmd scratch.d -version=scratchExe 编译可执行版本。


4

有一个 pragma:

void foo(){
//...
}

version(fooMain){
pragma(startaddress, foo);
}

1
pragma(startaddress) 绕过 C 和 D 运行时库的初始化,仅应用于低级任务。它不适用于此情况。(这怎么得到了 5 个赞?这从未生效过且永远不会生效。) - Vladimir Panteleev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接