Смешивание кода C и D в одной программе? - PullRequest
7 голосов
/ 22 августа 2010

Возможно ли это? т.е. скомпилировать .c с помощью dmc и .d с помощью dmd, а затем связать их вместе, будет ли это работать? Смогу ли я вызывать функции D из кода C, делиться глобальными переменными и т. Д.? Спасибо.

Ответы [ 2 ]

10 голосов
/ 22 августа 2010

Да, это возможно. На самом деле это одна из главных особенностей dmd. Чтобы вызвать функцию D из C, просто сделайте эту функцию 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 для получения дополнительной информации.

2 голосов
/ 16 сентября 2010

Приведенный выше ответ неверен, насколько я знаю.Потому что основная процедура D должна быть вызвана перед использованием любых функций D.Это необходимо для «инициализации» D, например, его сборки мусора.Чтобы решить эту проблему, вы можете просто сделать так, чтобы в программу входила основная подпрограмма в D, или вы можете каким-то образом вызвать основную подпрограмму D из C. (Но я не знаю точно, как это работает)

...