以使用的库版本为条件的函数声明?

Function declaration conditioned on a used library version?

我遇到以下问题:假设我正在使用库 Foo,并且我在个人库中使用了一个函数 bar。但是,在即将发布的版本中,bar 的函数定义将发生变化。例如,

bar(int first, int second, int third)

会变成

bar(int first, int newSecond, int second, int third)

在我的情况下保持向后兼容性将是有益的,所以我想知道是否可以根据库版本定义我的函数

我的原码:

int myFoo(int first, int second, int third){
    auto something = bar(first, second, third);
    ....
}

新函数可能类似于

int myFoo(int first, int second, int third){
    auto newSecond = X;
    auto something = bar(first, newSecond, second, third);
    ....
}

在 python 我可以做类似

int myFoo(int first, int second, int third){
    if Foo.version == "old":
        auto something = bar(first, second, third);
    else:
        auto newSecond = X;
        auto something = bar(first, newSecond, second, third);
    ....
}

但是我怎样才能在 C++ 中完成同样的事情呢?使用 #IF ... 行得通吗?我用 Google 搜索了一下,但结果并不是特别有用,因为我真的不知道要查找的正确术语(很高兴学习一些新术语)

有几种方法可以解决这个问题。

首先想到的是使用预处理器指令:

#define OLD_VERSION // Can be set in code or when you compile the code

int myFoo(int first, int second, int third){
    #ifdef OLD_VERSION
        auto something = bar(first, second, third);
    #else
        auto newSecond = X;
        auto something = bar(first, newSecond, second, third);
    ....
    #endif
}

或者,您可以包装 bar 函数并使用函数重载,根据您传入的参数,将调用适当的函数:

int myFoo(int first, int second, int third) { }
int myFoo(int first, int newSecond, int second, int third){ }