有没有办法在 D 编程语言中重写模块的 main 函数?

发布于 2024-12-10 11:57:35 字数 316 浏览 0 评论 0 原文

如果确实需要,可以在 C 中指定 __attribute__((weak)) (请参阅 scriptedmain)。这使得程序可以兼作 API 和可执行文件,从而允许导入 API 的代码覆盖 main 函数。

D有办法吗? Python 有 if __name__=="__main__": main(),但 C 中的 weak 语法似乎更接近。

If you really need to, you can specify __attribute__((weak)) in C (see scriptedmain). This allows a program to double as API and executable, allowing code that imports the API to overwrite the main function.

Does D have a way to do this? Python has if __name__=="__main__": main(), but the weak syntax in C seems much closer.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

泅人 2024-12-17 11:57:35

是的,使用版本指令,这需要 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 上。

Yes, using version directives, which require special options to rdmd and 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());
    }
}

Example:

$ ./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

Also posted on RosettaCode.

携君以终年 2024-12-17 11:57:35

我相信 __attribute__((weak)) 是一个 GNU 扩展,它为弱链接发出特殊的链接器指令,因此它是特定于工具链的。 AFAIK 中的 DMD 中没有任何内容,但其他 D 编译器(GDC 或 LDC)可能支持其后端扩展。

I believe __attribute__((weak)) is a GNU extension which emits special linker instructions for weak linking, so it's very toolchain-specific. There is nothing in DMD for this AFAIK, but other D compilers (GDC or LDC) may support their backends' extensions.

左耳近心 2024-12-17 11:57:35

IIRC 有一种方法可以将代码编译为库而不是目标文件。由于链接器搜索内容的方式,您可以使用它来获得相同的效果;只需将目标与您要首先使用的主目录放在链接顺序中即可。

IIRC there is a way to get code to compile to a library rather than an object file. Because of the way the linker searches for things, you can use that to get the same effect; just put the target with the main you want to use first in the link order.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文