2015-03-19 69 views
0

我想用mingw32/VC實現我的DLL的跨平臺構建。
目前,一切都與明確的一面完美。但是我必須包裝在宏觀幾件事情對於VC(它是建立爲/ TC),例如:星號在參數名稱中用C預處理器

void __attribute__((fastcall)) do1 ( A*, B , C, D); 
bool __attribute__((fastcall)) (*do2) (E*, F); 

第一個是簡單,只需一個宏:

#ifdef __MINGW32__ 
    #define __FASTCALL__ __attribute__((fastcall)) 
#elif _MSC_VER 
    #define __FASTCALL__ __fastcall 
#else 
    #error "unsupported compiler" 
#endif 

問題來了與第二個。調用約定與函數指針應該看起來像

bool (__fastcall *do2) (E*, F); 

我嘗試下面的宏(我跳過IFDEF部分):

#define __FASTCALLP__(func) (__attribute__((fastcall))(*##func)) 
#define __FASTCALLP__(func) (__fastcall *##func) 

,或者用星號通功能名稱:

#define __FASTCALLP__(func) (__attribute__((fastcall))(##func)) 
#define __FASTCALLP__(func) (__fastcall ##func) 

兩者均失敗

error: pasting "*" and "function_name" does not give a valid preprocessing token

我可以在我的方法中錯誤嗎?或者我必須ifdef整個代碼塊或將其分隔到不同的文件?

+1

這是否工作:簡單的前'func'忽略''##? – 2015-03-19 11:01:49

+0

呃....對我來說很愚蠢,不去檢查這麼簡單的方法:)請把它當作答案) – pugnator 2015-03-19 11:04:46

回答

2

問題出在串聯運算符##。這將通過連接左和右手側,其不存在產生新的預處理器令牌(*do2是沒有定義令牌)

只需省略它和寫這樣(省略#ifdef S):

#define __FASTCALL__(func) (__attribute__((fastcall))(func)) 
#define __FASTCALL__(func) (__fastcall func) 

,並使用這樣的:

bool __FASTCALL__(do1)(A*, B , C, D); 
bool __FASTCALL__(*do2)(E*, F);