2010-08-22 21 views

Respuesta

10

Sí es posible. De hecho, esta es una de las características principales de dmd. Para llamar a una función D desde C, simplemente realice esa función extern(C), p.

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

Ver Interfacing to C para obtener más información.

+1

+1 para el enlace exactamente la página correcta Tenga en cuenta que el código C y el código D deben estar en archivos separados. (Parece obvio, pero aún así debe mencionarse explícitamente). –

1

La respuesta anterior es incorrecta hasta donde yo sé. Porque se debe llamar a la rutina principal D antes de usar cualquier función D. Esto es necesario para "inicializar" D, f.e. su recolección de basura. Para resolver eso, simplemente puede hacer que el programa sea ingresado por una rutina principal en D o de alguna manera puede llamar a la rutina principal D desde C. (Pero no sé exactamente cómo funciona)

+1

Aquí hay una discusión de 2007 sobre eso: http://www.digitalmars.com/d/archives/digitalmars/D/learn/Calling_D_from_C_-_What_s_the_present_status_6003.html –