2010-08-22 2 views

risposta

10

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.

+1

+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.) –

1

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)

+1

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 –