0

node addon在跨多个版本的节点编译时如何处理我的方法的多个版本。例如:uv_inet_ptonand uv_inet_ptonof nodeversion0.10*不同于0.12.*. 这些版本的返回类型不同。我可以通过定义宏或预处理器来处理这种情况吗?

4

1 回答 1

1

0.10中的签名是:

typedef struct uv_err_s uv_err_t;
uv_err_t uv_inet_pton(int af, const char* src, void* dst);

struct uv_err_s {
  /* read-only */
  /* MY ADDITION:
     uv_err_code is an enum here, and 0 means OK.
  */
  uv_err_code code;
  /* private */
  int sys_errno_;
};

所以调用这个函数会返回一个结构体,它有一个code字段,指定错误,0 表示成功。

至于较新的版本,返回类型已更改:

UV_EXTERN int uv_inet_pton(int af, const char* src, void* dst);

因此,使用新旧版本中提供的版本信息,可以推断出您正在编译的版本。链接用于0.101.0x,但您也可以从中获取类似信息0.12

如果函数返回 int 正常,0 表示成功,其他值表示失败,则需要使用下面提供的函数:

int my_inet_pton(int af, const char* src, void* dst)
{
#ifdef VERSION_0_10_CHECK
    /* I'm a little rusty on enums, you might need to
     * cast to int, i'm not sure */
    return uv_inet_pton(af, src, dst).code;
#else
    return uv_inet_pton(af, src, dst);
#endif
}

对于其他可能的不兼容性,请尝试在主代码中尽可能少地使用版本检查,并为脏工作编写包装器。这样,您的主要代码会看起来更好。

于 2015-04-13T16:28:24.600 回答