本当に必要な場合は__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 に特別なオプションを必要とするバージョン ディレクティブを使用します。
scriptedmain.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());
}
}
test.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 には、コードをオブジェクト ファイルではなくライブラリにコンパイルする方法があります。リンカーが物事を検索する方法により、それを使用して同じ効果を得ることができます。使用したいメインのターゲットをリンク順の最初に置くだけです。