2011-04-20 19 views
0

不應該這樣:##宏參數串聯不工作如我所料

#define MOGSH_CONCAT (x,y) x##y 
#define MOGSH_DOUBLE (a,b) MOGSH_CONCAT(a,b) 
#define MOGSH_DEFINEPROC (p) MOGSH_DOUBLE(_gt,p) options_dialog::p; 

MOGSH_DEFINEPROC(AssignMainForm); 

高興地擴展爲:

_gtAssignMainForm options_dialog::AssignMainForm; 

鑑於_gt沒有定義,_gtAssignMainForm是:

typedef void (__stdcall *_gtAssignMainForm)(); 

options_dialog只是一個類,其中AssignMainForm是一個靜態成員。

相反,在MSVC9,我得到的錯誤:

'a' : undeclared identifier 

MOGSH_DEFINEPROC(AssignMainForm); 
+1

刪除宏名和定義中的'(arguments)'之間的空格?這使它在gcc中適用於我,但我沒有MSVC來測試。 – Andy 2011-04-20 22:59:47

+1

最終發現它:可能重複[? C++空間免費語言](http://stackoverflow.com/questions/4814952/c-space-free-language)。不能責怪你沒有找到它。 – delnan 2011-04-20 23:02:17

+0

哈利路亞,兄弟,它的作品! :D,thx安迪先生! – Cray 2011-04-20 23:06:59

回答

3

在函數宏定義行可以有宏名之間沒有空格和(開始參數列表。

#define MOGSH_CONCAT(x,y) x##y 
//    ^no whitespace allowed here 

當你擁有了它,現在(有空格),MOGSH_CONCAT是與(x,y) x##y更換名單,這就是爲什麼你得到這樣奇怪的結果一類對象宏。