2011-01-28 68 views
4

我想編寫C++宏服用任意參數,如:C++微距文本操作

#define MANIP(...) \ 
//Implementation 

這樣寫

MANIP(m_a, m_b, m_c); 

擴展到

f(a, b, c); 
g("a", "b", "c"); 

這可能嗎?

預先感謝您幫助我與這個看似奢侈的問題:)

+0

您想從「m_a」中刪除「m」嗎? – Nawaz 2011-01-28 19:41:21

+3

我想你會發現很難從宏參數中去掉前導m_。但宏和C++是他們是什麼,我不願意說「不可能」... – 2011-01-28 19:41:34

回答

6

我不相信會有一個簡單的方法可以從m_aa。但是,字符串運算符#是標準C和C++的一部分。給定

#define STRING(x) #x 

然後STRING(m_a)

例如,將被轉換到"m_a"

0

這不是真的有可能有預處理器(這是什麼處理的#define語句,而不是C++編譯器本身)將參數分解成多個部分。因此,如果您嘗試從m_a中提取a,則無法執行此操作。相反,它會是更好地界定喜歡你的宏:

 
    #define MANIP(m, a, b, c) 

,並要求「M」是一個獨立的輸入。其次,您不能輕鬆地將非字符串輸入轉換爲字符串輸入。 IE,從a轉換爲「a」不容易實現。我是這樣說的,因爲我知道一些CPP(C-Pre-processor)可以做到這一點。但我不認爲它是可移植的。

通常,當您嘗試做複雜的事情時,您應該使用編程語言而不是CPP來編寫

具體來說,在C++中,您可以使用模板來獲得比CPP的#define語句更多的工作。

0

預處理器無法分割令牌。這意味着不可能從m_foo或(最近已被要求)foo"foo"生產foo

如果您可以使用可變宏(正如Matthieu M.指出的那樣,這意味着C99或C++ 0x),Jens Gustedt的P99 library在這裏會有所幫助。有宏可以使這更容易,但是讓我們使不熟悉庫的人可讀,好嗎?

簡體案例:可以傳遞兩個或三個參數。

#define MANIP2(a, b) \ 
    f(a, b)   \ 
    g(#a, #b) 

#define MANIP3(a, b, c) \ 
    f(a, b, c)   \ 
    g(#a, #b, #c) 

#define MANIP(...) \ 
    MANIP_(   \ 
     P99_PASTE2(MANIP, P99_NARG(__VA_ARGS__)), \ 
     __VA_ARGS__) \ 

#define MANIP_(MANIPMAC, ...) MANIPMAC(__VA_ARGS__) 

這說明了基本原理。在實踐中,有一些foreach風格的宏(類似於Boost的)使它更容易編碼(雖然,正如我所提到的,對於外行來說更難以閱讀)。詳細信息請參見P99 library documentation