在define宏中使用typedef定义函数

defining a function using a typedef inside a define macro

本文关键字:typedef 定义 函数 define      更新时间:2023-10-16

我见过在不同的场景中使用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)和相应的导出。但以上对我来说没有任何意义。有人能帮我解释一下这个定义吗?如果你需要更多的代码澄清,我绝对可以提供它。这是迄今为止我见过的最令人沮丧和复杂的函数原型编写方式。

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

#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())初始化