在同一个程序中混合使用C和D代码?

7

这是否可能?即用dmc编译.c文件,用dmd编译.d文件,然后将它们链接在一起,这样可以工作吗?我能够从C代码中调用D函数,共享全局变量等吗?谢谢。

2个回答

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;
}

请参阅与C语言接口获取更多信息。


1
+1 为了链接到正确的页面。请注意,C代码和D代码必须放在不同的文件中。(听起来很明显,但仍然需要明确说明。) - Donal Fellows

2
据我所知,上面的答案是错误的。因为在使用任何 D 函数之前必须调用 D 主程序。这是必要的,例如它的垃圾回收机制需要初始化。为了解决这个问题,你可以让程序通过 D 的主程序进入,或者你可以以某种方式从 C 中调用 D 的主程序。(但我不确定这个方法的具体实现方式)

1
这是一个关于2007年的讨论:http://www.digitalmars.com/d/archives/digitalmars/D/learn/Calling_D_from_C_-_What_s_the_present_status_6003.html - he_the_great

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接