我在这个标题FTD2XX中找到了几行代码,它们似乎有三种返回类型的函数签名。我怎么解释这个?这是一个例子
FTD2XX_API
FT_STATUS WINAPI FT_Read(
FT_HANDLE ftHandle,
LPVOID lpBuffer,
DWORD nBufferSize,
LPDWORD lpBytesReturned
);
非常感谢所有帮助。
答案 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函数。
WINAPI
是windef.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)
)。