C/CPP 用于处理一个方法的多个版本的宏或预处理器

C/CPP Macro or a pre processor to handle multiple versions of a method

如何在我的 node addon 中跨多个版本的节点进行编译时处理方法的多个版本。例如:node 版本 0.10*uv_inet_ptonuv_inet_pton 不同于 0.12.*。 return 类型在这些版本中有所不同。我可以通过定义宏或预处理器来处理这种情况吗?

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_;
};

所以对这个函数的调用 return 是一个结构,它有一个 code 字段,它指定错误,0 表示成功。

至于newer versions,return类型已经改变:

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

因此,使用 newer and older 版本中提供的版本信息,您可以推断出您正在编译的版本。这些链接适用于 0.101.0x,但您也可以在 0.12 中获得类似信息。

如果函数return是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
}

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