Синхронизация определений между Erlang и C - PullRequest
1 голос
/ 18 ноября 2010

С 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 ]

3 голосов
/ 18 ноября 2010

Я ничего не знаю об Erlang, но, вероятно, вы не можете просто создать файл .h только с необходимыми определениями и #include его (или эквивалент) в обоих местах.

Если вы не можете этого сделать, я бы посмотрел на автоматическое создание файла для одного из другого.

РЕДАКТИРОВАТЬ: только что посмотрев на документы Erlang, формат очень похож, но не совсем то же самое.

Эрланг нуждается -define(Const, Replacement)

C необходимо #define const replacement

Итак, я бы написал один текстовый файл, содержащий синтаксис Erlang (только для этих определений), а затем в качестве шага перед сборкой в ​​моей сборке C я сделал бы что-то вроде

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

на временную копию этого файла, которую я затем #include поместил бы в мой источник C.

1 голос
/ 18 ноября 2010

Один очень динамичный способ - сохранить таблицу на 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, декодировать ее там в список кортежей и использовать для поиска.

1 голос
/ 18 ноября 2010

Вы можете (попытаться) использовать препроцессор C gcc в erlang, поскольку у gcc есть опции:

  • -E остановка после этапа предварительной обработки
  • -x language (вы можетеустановите тот, который дает правильный вывод)
  • -P запретить вывод #line
  • -C сохранять комментарии (не удалять / * * / и //)
...