保持Erlang和C之间的定义同步

时间:2010-11-18 11:40:47

标签: c erlang c-preprocessor

来自http://www.erlang.org/doc/apps/erts/driver.html

/* Keep the following definitions in alignment with the
 * defines in erl_pq_sync.erl
 */
#define DRV_CONNECT             'C'
#define DRV_DISCONNECT          'D'
#define DRV_SELECT              'S'

有没有简单的方法来共享Erlang和C源之间的宏值?

3 个答案:

答案 0 :(得分:3)

我对Erlang一无所知,但可能你不能只在两个地方创建一个只包含所需定义的.h文件,并且#include它(或等效)。

假设你不能这样做,我会考虑自动生成另一个文件。

编辑:刚刚看过Erlang文档,格式非常相似但不完全相同。

Erlang需要-define(Const, Replacement)

C需要#define const replacement

所以我会编写一个包含Erlang语法的文本文件(仅用于这些定义),然后作为我的C版本中的预构建步骤,我会按照

的方式做一些事情。
sed s/-define/#define/g 
sed s/[\(\),]//g

在该文件的临时副本上,然后在我的C源代码中#include

答案 1 :(得分:1)

你可以(尝试)在erlang中使用gcc的C预处理器,因为gcc有选项:

  • -E在预处理阶段后停止
  • -x language(您可以设置一个提供正确输出的内容)
  • -P禁止#line
  • 的输出
  • -C保留评论(不要删除/ * * /和//)

答案 2 :(得分:1)

一种非常动态的方法是使用具有char *name - >的#的宏来轻松生成C表。值。

然后使用它在开始时向erlang发送一个表。

#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)
};

使用此表将它在开头发送到erlang,将其解码为元组列表并使用它来查找。