如果你真的需要,你可以__attribute__((weak))
在 C 中指定(参见scriptedmain)。这允许程序兼作 API 和可执行文件,允许导入 API 的代码覆盖主函数。
D有办法做到这一点吗?Python 有if __name__=="__main__": main()
,但weak
C 中的语法似乎更接近。
如果你真的需要,你可以__attribute__((weak))
在 C 中指定(参见scriptedmain)。这允许程序兼作 API 和可执行文件,允许导入 API 的代码覆盖主函数。
D有办法做到这一点吗?Python 有if __name__=="__main__": main()
,但weak
C 中的语法似乎更接近。
是的,使用版本指令,这需要 rdmd 和 dmd 的特殊选项。
脚本main.d:
#!/usr/bin/env rdmd -version=scriptedmain
module scriptedmain;
import std.stdio;
int meaningOfLife() {
return 42;
}
version (scriptedmain) {
void main(string[] args) {
writeln("Main: The meaning of life is ", meaningOfLife());
}
}
测试.d:
#!/usr/bin/env rdmd -version=test
import scriptedmain;
import std.stdio;
version (test) {
void main(string[] args) {
writeln("Test: The meaning of life is ", meaningOfLife());
}
}
例子:
$ ./scriptedmain.d
Main: The meaning of life is 42
$ ./test.d
Test: The meaning of life is 42
$ dmd scriptedmain.d -version=scriptedmain
$ ./scriptedmain
Main: The meaning of life is 42
$ dmd test.d scriptedmain.d -version=test
$ ./test
Test: The meaning of life is 42
还张贴在RosettaCode上。
我相信__attribute__((weak))
这是一个 GNU 扩展,它为弱链接发出特殊的链接器指令,所以它是非常特定于工具链的。此 AFAIK 在 DMD 中没有任何内容,但其他 D 编译器(GDC 或 LDC)可能支持其后端的扩展。
IIRC 有一种方法可以让代码编译到库而不是目标文件。由于链接器搜索事物的方式,您可以使用它来获得相同的效果;只需将目标与要使用的主要目标放在链接顺序中。