用C ++解释一个带有三种返回类型的方法

时间:2016-06-21 00:46:44

标签: c++ return

我在这个标题FTD2XX中找到了几行代码,它们似乎有三种返回类型的函数签名。我怎么解释这个?这是一个例子

FTD2XX_API
FT_STATUS WINAPI FT_Read(
                         FT_HANDLE ftHandle,
                         LPVOID lpBuffer,
                         DWORD nBufferSize,
                         LPDWORD lpBytesReturned
);

非常感谢所有帮助。

1 个答案:

答案 0 :(得分:5)

实际的返回类型本身只是FT_STATUS

typedef ULONG   FT_STATUS; 

FTD2XX_API是一个使用__declspec指令定义DLL导入/导出处理的宏:

 #ifdef FTD2XX_EXPORTS 
 #define FTD2XX_API __declspec(dllexport) 
 #else 
 #define FTD2XX_API __declspec(dllimport) 
 #endif 

将API编译为DLL时,会定义FTD2XX_EXPORTS,以便导出DLL函数。使用API​​时,未定义FTD2XX_EXPORTS,因此导入DLL函数。

WINAPIwindef.h中的一个宏,它解析为调用约定(在Windows系统上为__stdcall):

#ifdef _MAC
...
#define WINAPI      CDECL
...
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
...
#define WINAPI      __stdcall
...
#else
...
#define WINAPI
...
#endif

因此,您的示例函数声明将解析为此(包括参数类型解析):

__declspec(dllimport)
unsigned long  __stdcall FT_Read(
                         void *ftHandle,
                         void *lpBuffer,
                         unsigned long nBufferSize,
                         unsigned long *lpBytesReturned
);

这些类型的宏在多个编译器中使用和/或编译为DLL的API中并不罕见。在这种情况下,导出的函数需要在实现与使用中以不同的方式声明,并且还取决于目标平台甚至使用的编译器(例如,某些编译器使用extern / __export而不是__declspec(dllimport) / __declspec(dllexport))。