2013-04-04 23 views
2

无法弄清楚这是怎么回事。这是我想要做的一个例子。传递参数时出现宏展开问题

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); 

我得到一个 - 错误:“通道”在此范围

未声明是我甚至可以做的,你可以有内宏宏并通过它们传递参数?我本来以为

DO_SOMETHING_##type.Doitnow() 

最终将会扩展到

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

究竟是什么,你正在努力实现(部分来自使得代码一个痛苦的调试)吗? – 2013-04-04 06:43:32

+0

我只是想了解更多关于宏扩展的内容,结构来自g2log [link](https://sites.google.com/site/kjellhedstrom2/g2log-efficient-background-io-processign-with- c11)在g2log.h中。我相信他有这样做的很好的理由。 – James 2013-04-04 06:59:28

+2

请注意,许多(如果不是全部的话)编译器提供了一个选项,将预处理器的结果写入文件。例如在Visual Studio中,您可以在项目属性/配置属性/ C/C++ /预处理器/预处理到文件中找到它。对于gcc和g ++,这是-E选项。 – TobiMcNamobi 2013-04-04 07:11:45

回答

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() 
+0

谢谢!这工作,认为我大约10分钟前正好尝试过,必须需要从屏幕休息一会儿 – James 2013-04-04 06:56:28

-1
#define TEST "TEST1" 
#define CHANNEL 1 

WhatThe(TEST, CHANNEL).DoitNow() 

这有相同的代码量改变,只要你想要做一个不同的测试或CHANNEL ,作为您提出的解决方案。要进行不同的测试,只需更改定义即可。

要合并的参数,这样做:

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

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

... 
+0

如果对于每一个不同的“测试”,我们必须改变#defines,那么是不是更好,只是通过WhatThe Class中的参数?该解决方案不会解决或简化代码。 – Abhineet 2013-04-04 06:58:19

+0

即使它不减少代码,它仍然通过将“测试”部分与实际代码分开来提高可读性。我还编辑了我的答案,以反映组合参数的一种方法。 – maditya 2013-04-04 07:01:52

+0

如果我有n个通道,你是否会倾向于为TEST1和TEST2使用n个define的数字,并假设我将来需要添加TEST3,然后再定义n个定义等等? – Abhineet 2013-04-04 07:10:52