2013-04-04 22 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