将方法替换为特定参数计数的宏

Macro to replace Method with specific Argument count

本文关键字:参数 方法 替换      更新时间:2023-10-16

我有一个带有两种不同声明的"计算"方法:

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

我只想将 calculate(int parmA) 替换为调用 'calculateNew':

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 即可。

重构绝对是要走的路,否则你的代码最终会变得一团糟,并且更难维护。但是,如果您真的想要一个"解决方法"(因为这就是其他所有内容),为什么不使用 3 个参数重载calculateNew,而只需在重载的参数中调用初始版本:

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

然后,您可以使用 IDE 的 find & replace 将 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

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

谢谢你的帮助。