我见过在单独的场景中使用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)和相应的导出。但上面对我来说没有任何意义。任何人都可以帮助理解这个定义吗?如果您需要更多关于代码的说明,我绝对可以提供。这是迄今为止我见过的最令人沮丧和复杂的函数原型。
答案 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()
)进行初始化。