使用特定参数计数替换Method的宏

时间:2015-02-03 13:04:12

标签: c++ macros c-preprocessor

我有一个'计算'方法有两个不同的声明:

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

我想通过调用' calculateNew'来替换只计算(int parmA):

int calculateNew(int parmA);

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

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

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

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

我在这里做错了什么?如果只有一个参数,我如何告诉预处理器替换?我甚至可以这样做吗?

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

重构肯定是要走的路,因为否则你的代码会陷入混乱,并且难以维护。 但如果你真的想要一个"解决方法" (因为那是其他所有内容)为什么不用3个参数重载calculateNew并在重载的版本中调用初始版本:

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

然后你可以使用find&替换您的IDE以将calculate替换为calculateNew

答案 2 :(得分:0)

考虑到评论和建议的答案,我实际上做了一些改变以实现我所需要的,因为宏并不适合这个问题。

即使我不太喜欢这个解决方案,它也可以完成工作,稍后我会花一些时间来提出更强大的解决方案。

我做了一些重构,取代了两个声明

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

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

感谢您的帮助。