2010-11-18 20 views

Répondre

3

Je ne sais rien sur Erlang, mais probablement vous ne pouvez pas créer un fichier .h avec juste les définitions requises et # inclure (ou équivalent) dans les deux endroits. En supposant que vous ne pouvez pas faire cela, je regarderais la génération automatique d'un fichier pour l'un de l'autre.

EDIT: Après avoir regardé les documents Erlang, le format est très similaire mais pas tout à fait le même.

Erlang a besoin -define(Const, Replacement)

C a besoin #define const replacement

donc j'écrire un fichier texte qui contient la syntaxe Erlang (pour seulement ces définitions), puis comme une étape de pré-construction dans ma construction C I ferait quelque chose le long des lignes de

sed s/-define/#define/g 
sed s/[\(\),]//g 

sur une copie temporaire de ce fichier, que je puis #include dans ma source C.

+0

Notez que cette solution ne fonctionnera pas dès que votre définition de macro utilise une autre macro. – Zed

+0

@Zed: En effet, ou avec des macros paramétrées (fonctionnelles). Mais les exemples dans l'original sont très simples et devraient être OK. – Vicky

+0

Oui, ceux dont j'ai besoin sont aussi simples. –

1

Vous pouvez (essayer de) utiliser C préprocesseur de gcc en Erlang, comme gcc ont des options:

  • -E arrêt après l'étape pré-traitement
  • -x language (vous pouvez définir une qui donne une sortie correcte)
  • -P inhibit sortie #line
  • -C garder les commentaires (ne pas enlever/* */et //)
1

Une manière très dynamique est de conserver une table en C qui peut facilement être générée par des macros utilisant # qui ont des valeurs char *name ->.

Ensuite, utilisez ceci pour envoyer un tableau au début.

#define DRV_CONNECT    'C' 
#define DRV_DISCONNECT   'D' 
#define DRV_SELECT    'S' 

#define ENTRY(X) {#X, X} 

struct table_entry 
{ 
    const char *name; 
    int value 
}; 

struct table_entry table[] = 
{ 
    ENTRY(DVR_CONNECT), 
    ENTRY(DRV_DISCONNECT), 
    ENTRY(DRV_SELECT) 
}; 

Utilisez ce tableau pour envoyer au début Erlang, décode là dans une liste de tuple et l'utiliser pour regarder.