用特定参数计数替换方法的宏

Macro to replace Method with specific Argument count

我有一个包含两个不同声明的 'calculate' 方法:

int calculate(int parmA);
int calculate(int parmA, int parmB, int parmC);

我只想用对 'calculateNew':

的调用替换 calculate(int parmA)
int calculateNew(int parmA);

我尝试过以两种不同的方式使用定义:

#define calculate calculateNew
#define calculate(parmA) calculateNew(parmA)

当我这样做时,由于参数数量不同,我在代码的其他部分遇到编译器错误:

macro "calculate" passed 2 arguments, but takes just one

我在这里做错了什么?我怎样才能告诉预处理器只有在有一个参数时才替换?我能做到吗?

注意:我意识到这可能不是解决此问题的最佳方法,但必须这样做。

我从你的评论中了解到你想根据预处理器时已知的一些 属性 来调用一个或另一个。如果您可以重命名原始重载,则可以制作内联蹦床。将您原来的单参数重载重命名为 originalCalculate 然后添加:

inline int calculate(int parmA)
{
#if new_should_be_used()
  calculateNew(parmA);
#else
  originalCalculate(parmA);
#endif
}

如果您需要在不同的编译单元中有不同的行为,只需将 inline 替换为 static

重构绝对是必经之路,否则您的代码最终会变得一团糟,并且更难维护。 但是如果你真的想要一个 "workaround" (因为这就是其他一切)为什么你不用 3 个参数重载 calculateNew 并且只调用重载的初始版本:

int calculateNew (int a) { whatever };
int calculateNew (int a, int b, int c) { return calculate(a, b, c); };

然后您可以使用 IDE 的查找和替换将 calculate 替换为 calculateNew

考虑到评论和建议的答案,我实际上做了一些更改来实现我需要的,因为宏不适合原来的问题。

虽然我不太喜欢这个解决方案,但它完成了工作,我稍后会花一些时间来想出一个更可靠的解决方案。

我做了一些重构,替换了两个声明

int calculate(int parmA);
int calculate(int parmA, int parmB, int parmC);

int calculateSimple(int parmA);
int calculateComplex(int parmA, int parmB, int parmC);

这样我就可以轻松地用宏替换调用

#define calculateSimple calculateNew

没有任何错误,一切都按预期工作。

感谢您的帮助。