Существуют ли макросы, которые можно использовать для проверки версии Erlang в коде драйвера C?
Erlang R15B добавлен ErlDrvSSizeT
typedef и R16B добавлены erl_drv_output_term
функционировать и устарел старый эквивалент. Есть ли способ проверить эти различия с помощью макросов препроцессора, чтобы поддерживать более старые версии Erlang с тем же кодом?
1 ответ
Вы можете использовать ERL_DRV_EXTENDED_MAJOR_VERSION
а также ERL_DRV_EXTENDED_MINOR_VERSION
значения макросов, представленные в erl_driver.h
, чтобы принимать решения об особенностях. Всякий раз, когда изменяется драйвер API, эти значения соответственно увеличиваются. Эти приращения всегда объясняются в примечаниях к выпуску Erlang/OTP.
Например, Erlang/OTP R15B изменил некоторые типы параметров функций API с int
в новый тип ErlDrvSizeT
лучше справляться с 64-битными платформами. Вы можете проверить это и компенсировать это для более старых версий pre-R15B, используя код ниже:
#if ERL_DRV_EXTENDED_MAJOR_VERSION < 2
typedef int ErlDrvSizeT;
#endif
Этот typedef позволяет использовать тип ErlDrvSizeT
даже для более старых версий драйверов.
На момент написания этой статьи, Erlang/OTP версии 17.3 и версии 6.2 системы времени исполнения Erlang (erts) являются актуальными. Для erts 6.2, ERL_DRV_EXTENDED_MAJOR_VERSION
а также ERL_DRV_EXTENDED_MINOR_VERSION
имеют значения 3 и 1 соответственно. Изменения в этом коммите Erlang/OTP создали эти значения версии.