解释C 中三种返回类型的方法

Interpreting a method with three return types in C++

本文关键字:三种 返回类型 方法 解释      更新时间:2023-10-16

我在此标头FTD2XX中找到了几行代码,这些代码似乎具有具有三种返回类型的函数签名。我该如何解释?这是一个示例

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

所有帮助都非常感谢。

实际返回类型本身只是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 Systems上的__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
);

这些类型的宏在API中并不罕见,这些宏本来不常用于多个编译器和/或编译为DLL中的API。在这种情况下,在实现中,导出功能与使用情况相对于使用,也需要根据目标平台,甚至使用的编译器(例如,某些编译器使用 extern/ __export而不是 __declspec(dllimport)/ __declspec(dllexport))。>