带有C预处理器的参数名称中的星号

时间:2015-03-19 10:56:39

标签: c c-preprocessor stringification

我想用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整个代码块或将它分成不同的文件?

1 个答案:

答案 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);