我正在查看一些 C 代码,但我一生都无法弄清楚谷歌要弄清楚以下函数定义中的以下额外标识符是什么:
// Whats this? It seems there are two return types?
// |
// V
XN_C_API XnStatus xnInit(XnContext** ppContext) {
...
}
如果这与其原始上下文相去甚远,我深表歉意(它来自 OpenNI,如果需要,我将非常乐意发布链接)
我正在查看一些 C 代码,但我一生都无法弄清楚谷歌要弄清楚以下函数定义中的以下额外标识符是什么:
// Whats this? It seems there are two return types?
// |
// V
XN_C_API XnStatus xnInit(XnContext** ppContext) {
...
}
如果这与其原始上下文相去甚远,我深表歉意(它来自 OpenNI,如果需要,我将非常乐意发布链接)
它是使用定义的符号#define
。搜索代码以找到它的定义位置。您的函数的实际返回类型是XnStatus
, whileXN_C_API
很可能定义为一组修饰符。这些通常用于为具有特定属性的函数定义导出的符号或其他属性。
例如,在我的代码(Windows 上的 DLL 项目)中,我有这个:
#ifdef MGR_EXPORTS
#define MGR_API __declspec(dllexport)
#else
#define MGR_API __declspec(dllimport)
#endif
...
#define MGRAPI StatusCode __declspec(nothrow) WINAPI
所有公共(导出)函数声明如下所示:
MGR_API MGRAPI MgrInit ()
第一个符号MGR_API
用于控制如何从 DLL 导出符号;另一个,MGRAPI
帮助声明具有相同修饰符集和相同返回类型(即StatusCode
)的所有公共函数。
如果需要更新此项目中所有公共函数的声明,这很容易,因为只需要更改定义的符号,所有函数都会立即进行更改。
是这样定义的
#define XN_C_API XN_C_API_IMPORT
#define XN_C_API_IMPORT XN_API_IMPORT
#define XN_API_IMPORT __declspec(dllimport)
__declspec(dllimport)
表示该函数是从 DLL 文件中导入的。