使用define宏中的typedef定义函数

时间:2015-07-23 03:31:23

标签: c++ typedef c-preprocessor

我见过在单独的场景中使用typedef和#define。但是,我从未遇到过一个在另一个内部的代码。即,以下

#define DECL_STDXL_FUNC(apiname, apitype, args)    \
  typedef XLstatus (_XL_EXPORT_API *apitype) args

这稍后用于声明一个函数原型(显然)就像这样

DECL_STDXL_FUNC ( xlGetChannelTime,   XLGETCHANNELTIME, (
              XLportHandle        portHandle, 
              XLaccess            accessMask,
              XLuint64            *pChannelTime )
);

基本上,头文件应该定义我只有dll的函数。这告诉我,我需要使用_declspec(dllimport)和相应的导出。但上面对我来说没有任何意义。任何人都可以帮助理解这个定义吗?如果您需要更多关于代码的说明,我绝对可以提供。这是迄今为止我见过的最令人沮丧和复杂的函数原型。

1 个答案:

答案 0 :(得分:2)

通过预处理器运行它,至少在心理上(这是我正在做的):

#define DECL_STDXL_FUNC(apiname, apitype, args)    \
  typedef XLstatus (_XL_EXPORT_API *apitype) args

有趣的是:宏的apiname参数未使用。

DECL_STDXL_FUNC ( xlGetChannelTime,   XLGETCHANNELTIME, (
              XLportHandle        portHandle, 
              XLaccess            accessMask,
              XLuint64            *pChannelTime )
);

翻译时,会变为:

typedef XLstatus (_XL_EXPORT_API *XLGETCHANNELTIME)(XLportHandle portHandle, 
              XLaccess accessMask, XLuint64 *pChannelTime);

也就是说,XLGETCHANNELTIME成为函数类型的特定指针的名称。 _XL_EXPORT_API可能与从共享库(DLL)符号列表导入或导出相关。各种XLlowercase名称是代码定义的类型。

您将能够定义此类型的变量:

XLGETCHANNELTIME get_channel_time = …;

可能需要通过某种符号查找函数(在最常见的类Unix系统中dlopen())进行初始化。