我想用mingw32 / VC实现我的DLL的跨平台构建 目前,mingw方面的一切都很完美。但是我必须在宏中为VC包装几个东西(它被构建为/ TC),例如:
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)
两者都以
失败错误:粘贴" *"和" function_name"没有给出有效的 预处理令牌
我的方法可能完全错了吗?或者我必须ifdef整个代码块或将它分成不同的文件?
答案 0 :(得分:2)
问题在于Concatenation-Operator ##
。它将通过连接左侧和右侧产生一个新的预处理器令牌,这个令牌不存在(*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);