C函数定义中的返回类型的多个关键字

时间:2013-06-05 02:37:06

标签: c

我正在查看一些C代码,但在我的生活中无法弄清楚要在下面的函数定义中找出以下额外标识符的内容:

//  Whats this? It seems there are two return types?
//    |
//    V 
   XN_C_API XnStatus xnInit(XnContext** ppContext) {
       ...
   }

我很抱歉,如果这与其原始背景相距太远(来自OpenNI,我会非常乐意在需要时发布链接)

2 个答案:

答案 0 :(得分:5)

这是使用#define定义的符号。搜索代码以查找其定义的位置。函数的实际返回类型为XnStatus,而XN_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)声明所有公共函数。

如果需要更新此项目中所有公共函数的声明,则很容易,因为只需要更改定义的符号,所有函数都会立即进行更改。

答案 1 :(得分:3)

定义如下

#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文件导入的。