来自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源之间的宏值?
答案 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,将其解码为元组列表并使用它来查找。