代码之家  ›  专栏  ›  技术社区  ›  Alexey Romanov

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

  •  1
  • Alexey Romanov  · 技术社区  · 15 年前

    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 回复  |  直到 10 年前
        1
  •  3
  •   Vicky    15 年前

    我对Erlang一无所知,但想必您不能只创建一个.h文件,其中包含所需的定义,并在这两个位置包含它(或等效的)。

    如果你做不到这一点,我会考虑自动生成一个文件从另一个。

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

    Erlang需要 -define(Const, Replacement)

    C需要 #define const replacement

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

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

    在那份文件的临时副本上,我会 #include 在我的C源中。

        2
  •  1
  •   Vovanium    15 年前

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

    • -E 预处理阶段后停止
    • -x language (您可以设置一个正确的输出)
    • -P 抑制输出 #line
    • -C 保留注释(不要删除/**/和//)
        3
  •  1
  •   Peer Stritzinger    15 年前

    一种非常动态的方法是将一个表保存在C中,这样宏就可以使用 char *name ->值。

    然后使用这个在开头向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,在那里将其解码为元组列表并使用此表进行查找。