有可能吗?即使用dmc编译.c和使用dmd编译.d然后将它们链接在一起,这会有效吗?我能从C代码调用D函数,共享全局变量等吗?感谢。
答案 0 :(得分:10)
是的,这是可能的。实际上这是dmd的主要特征之一。要从C调用D函数,只需创建该函数extern(C)
,例如
// .d
import std.c.stdio;
extern (C) {
shared int x; // Globals without 'shared' are thread-local in D2.
// You don't need shared in D1.
void increaseX() {
++ x;
printf("Called in D code\n"); // for some reason, writeln crashes on Mac OS X.
}
}
// .c
#include <stdio.h>
extern int x;
void increaseX(void);
int main (void) {
printf("x = %d (should be 0)\n", x);
increaseX();
printf("x = %d (should be 1)\n", x);
return 0;
}
有关详细信息,请参阅Interfacing to C。
答案 1 :(得分:2)
据我所知,上述答案是错误的。 因为在使用任何D函数之前必须调用D主例程。 这对于“初始化”D,f.e是必要的。它的垃圾收集。 要解决这个问题,你只需要通过D中的主程序输入程序,或者你可以用C语言调用D主程序。(但我不确切知道这个程序是如何工作的)