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

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

本文关键字:方法 处理 版本 用于 CPP 处理器 预处理      更新时间:2023-10-16

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

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
}

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