使用宏动态选择版本

Dynamic version selection with macros

我在我的代码中使用了第 3 方库,我正在尝试测试它的最新版本。我的其他同事使用的是旧版本,我应该提交适用于这两个版本的代码。 现在的问题是我正在使用的函数在两个版本中具有不同数量的参数。

//eg- in ver_old
DoSomething(para 1, para 2);
//ver_new
DoSomething(para 1, para 2, para 3 , para 4);

如果我按照ver_new改代码,有旧代码的人无法编译,如果我使用ver_old,我无法编译代码.库中有一个函数可以将 return 版本作为 *char。

有没有办法可以用#if #else #endif到select哪个方法编译?或者使用带有 #define?

的版本字符

谢谢。

编辑 - 我将无法编辑库中的代码。

您可以在较新的库中实现两个版本,因此您的版本只有两个参数。它可以调用较新的版本,为缺少的参数提供一些默认值。

您的问题不够明确,但这是对答案的重要提示:

And there is a function in the library that would return the version as a *char.

宏甚至在您的代码被编译之前就已展开。您无法根据函数的 return 值进行条件编译(您只能在运行时调用它)。

如果您的代码应该适用于旧版本和新版本,您需要寻找不同的解决方案。对于其他参数,您可以提供默认值:

foo(int x, double y);              // old

foo(int x, double y, float z = 0); // new

您可以强制调用者 #define 宏,例如 #define NEW_LIB,然后在新代码中对宏 #ifdef。如果已定义,则使用新版本,否则使用旧版本。

否则,仅供参考,函数重载的 C 兼容替代方案:

typedef struct
{
  int    a;
  char   b;
  double c;
  char*  d;
} new_param_list;

void DoSomethingNew (new_param_list* list);

#define DoSomething(...) DoSomethingNew(&(new_param_list){ __VA_ARGS__ })

如果传递了 2 个参数,另外 2 个参数将设置为零。

对于不支持复合文字的 C++ 编译器,宏也可以调用构造函数 new_param_list(int a, char b, double c, char* d) 来获取匿名临时对象。