Есть ли способ переопределить основную функцию модуля в языке программирования D?
Если вам действительно нужно, вы можете указать __attribute__((weak))
в C (см. scriptedmain). Это позволяет программе работать как API и исполняемый файл, позволяя коду, импортирующему API, перезаписывать основную функцию.
У D есть способ сделать это? Python имеет if __name__=="__main__": main()
, но weak
Синтаксис в Си кажется гораздо ближе.
3 ответа
Да, используя директивы версии, которые требуют специальных опций для 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 есть способ заставить код компилироваться в библиотеку, а не в объектный файл. Из-за способа, которым компоновщик ищет вещи, вы можете использовать его для получения того же эффекта; Просто поставьте цель с основным, который вы хотите использовать в первую очередь в порядке ссылки.