2013-11-21 53 views
2

我需要能夠得到如下:C預處理器分裂 「INT X」 轉換成int&X

#define MY_MACRO(PARAM1,PARAM2) \ 
MY_OTHER_MACRO(TYPENAME_OF(PARAM1),PARAMNAME_OF(PARAM1));\ 
MY_OTHER_MACRO(TYPENAME_OF(PARAM2),PARAMNAME_OF(PARAM2));\ 

造成

MY_MACRO(int x,char *z) 

編譯爲

MY_OTHER_MACRO(int,x); 
MY_OTHER_MACRO(char*,z); 

或者如果它編譯爲:

它不會是世界末日

甚至這將是確定太:(ⅰ可以編碼MY_OTHER_MACRO與任一結果工作)

MY_OTHER_MACRO(int,x); 
MY_OTHER_MACRO(char,z); 

可替代地,如果有計數由空格分隔令牌的某種方式(並假定「*」是單獨的標記,我也可以使用它 - 例如2 vs 3) 通常,令牌由逗號分隔,據我所知。有什麼方法可以使用另一個角色?

+2

不太可能。宏可以加入,而不是分開。 – zch

回答

0

這是不可能的。

一種替代方案可能是爲類型和標識符設置不同的參數。

MY_MACRO(int, x, char *, z) 
+0

是的,或多或少我想要取代。我將在這裏留下這個問題,以防萬一答案即將出現,但我懷疑我只是要讓最終用戶代碼看起來不太明顯,而不是像C一樣。 – unsynchronized

8

你可以這樣做,但只有你必須知道所有的類型名稱預先極其困難的限制:除非用戶將其添加到列表中,將不與任何用戶定義類型工作已知類型也是如此 - 這當然不難。

接受這種限制,你可以做這樣的事情:

#define LPAREN (
#define RPAREN) 
#define COMMA , 

#define CAT(L, R) CAT_(L, R) 
#define CAT_(L, R) L ## R 
#define EXPAND(...) __VA_ARGS__ 

#define SPLIT(OP, D) EXPAND(OP CAT(SPLIT_, D) RPAREN) 

#define SPLIT_int LPAREN int COMMA 
#define SPLIT_char LPAREN char COMMA 
#define SPLIT_float LPAREN float COMMA 
#define SPLIT_double LPAREN double COMMA 

#define MY_MACRO(A, B) \ 
SPLIT(MY_OTHER_MACRO, A); SPLIT(MY_OTHER_MACRO, B); 

MY_MACRO(int x, char * z) // emits MY_OTHER_MACRO (int , x); MY_OTHER_MACRO (char , * z); 

添加一種已知類型的列表,如上述,一個班輪(#define SPLIT_myType LPAREN myType COMMA),並可以在任何地方完成在該程序只要在該類型實際被SPLIT使用之前發生,所以它不是世界的盡頭,儘管它具有高度的侵入性。

沒有簡單的方法讓星號在分割的左邊。它可能可以完成,但它會更加複雜,並且涉及將限制放在允許的變量名稱列表中,而IMO的情況要嚴重得多。也許更具侵入性,因爲在工作程序中幾乎肯定會有比類型更多的變量。