传递参数时的宏扩展问题

时间:2013-04-04 06:39:48

标签: c++

无法弄清楚这个是怎么回事。这是我正在尝试做的一个例子。

class WhatThe
{
 public:
  WhatThe(std::string Type, int channel) {}
  ~WhatThe() {}

  void Doitnow() {}
};

#define DO_SOMETHING_TEST1 WhatThe("TEST1", channel)
#define DO_SOMETHING_TEST2 WhatThe("TEST2", channel)

#define DO_IT(type, channel) \
        DO_SOMETHING_##type.Doitnow()

然后调用

DO_IT(TEST1,1);

我得到了一个错误:'channel'未在此范围内声明

我甚至可以做什么,你能在宏中有宏并通过它们传递一个参数吗?我原以为是

DO_SOMETHING_##type.Doitnow() 

最终会扩展到

WhatThe("TEST1", 1).DoitNow()

2 个答案:

答案 0 :(得分:2)

#define DO_SOMETHING_TEST1(channel) WhatThe("TEST1", channel)
#define DO_SOMETHING_TEST2(channel) WhatThe("TEST2", channel)

#define DO_IT(type, channel) \
        DO_SOMETHING_##type(channel).Doitnow()

答案 1 :(得分:-1)

#define TEST "TEST1"
#define CHANNEL 1

WhatThe(TEST, CHANNEL).DoitNow()

当您想要执行不同的TEST或CHANNEL时,它具有相同数量的代码,作为您提出的解决方案。要进行不同的测试,只需更改定义。

要组合参数,请执行以下操作:

#ifdef TEST1_CHANNEL1
    #define TEST "TEST1"
    #define CHANNEL 1
#endif

#ifdef TEST1_CHANNEL2
    #define TEST "TEST1"
    #define CHANNEL 2
#endif

...