使用宏动态选择版本
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)
来获取匿名临时对象。
我在我的代码中使用了第 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)
来获取匿名临时对象。