2010-08-22 4 views

Répondre

10

Oui, c'est possible. En fait, c'est l'une des principales caractéristiques de DMD. Pour appeler une fonction D à partir de C, faites simplement cette fonction extern(C), par ex.

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

Voir Interfacing to C pour plus d'informations.

+1

+1 pour le lien exactement à la bonne page. Notez que le code C et le code D doivent être dans des fichiers séparés. (Cela semble évident, mais doit toujours être déclaré explicitement.) –

1

La réponse ci-dessus est fausse autant que je sache. Parce que la routine principale D doit être appelée avant d'utiliser des fonctions D. Ceci est nécessaire pour "initialiser" D, f.e. sa collecte des ordures. Pour résoudre cela, vous pouvez simplement faire entrer le programme par une routine principale dans D ou vous pouvez appeler la routine principale D de C. (Mais je ne sais pas exactement comment cela fonctionne)

+1

Voici une discussion de 2007 à ce sujet: http://www.digitalmars.com/d/archives/digitalmars/D/learn/Calling_D_from_C_-_What_s_the_present_status_6003.html –

Questions connexes