È possibile? Compilare .c con dmc e .d con dmd e quindi collegarli insieme, funzionerà? Sarò in grado di chiamare le funzioni D dal codice C, condividere globalmente ecc.? Grazie.Miscelando codice C e D nello stesso programma?
risposta
sì è possibile. In effetti questa è una delle caratteristiche principali di dmd. Per chiamare una funzione D da C, basta fare quella funzione extern(C)
, ad es.
// .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;
}
Vedi Interfacing to C per maggiori informazioni.
La risposta di cui sopra è errata per quanto ne so. Perché la routine principale D deve essere chiamata prima di utilizzare qualsiasi funzione D. Questo è necessario per "inizializzare" D, f.e. la sua raccolta dei rifiuti. Per risolvere ciò, puoi semplicemente inserire il programma da una routine principale in D o puoi in qualche modo chiamare la routine principale D da C. (ma non so esattamente come funziona)
Ecco una discussione dal 2007 su questo: http://www.digitalmars.com/d/archives/digitalmars/D/learn/Calling_D_from_C_-_What_s_the_present_status_6003.html –
+1 per il collegamento alla pagina giusta. Si noti che il codice C e il codice D devono essere in file separati. (Sembra ovvio, ma deve ancora essere dichiarato esplicitamente.) –