C++ 在C++;
我在这个标题中发现了几行代码,它们似乎有三种返回类型的函数签名。我如何解释这一点?这里有一个例子C++ 在C++;,c++,return,C++,Return,我在这个标题中发现了几行代码,它们似乎有三种返回类型的函数签名。我如何解释这一点?这里有一个例子 FTD2XX_API FT_STATUS WINAPI FT_Read( FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD nBufferSize, LPDWORD
FTD2XX_API
FT_STATUS WINAPI FT_Read(
FT_HANDLE ftHandle,
LPVOID lpBuffer,
DWORD nBufferSize,
LPDWORD lpBytesReturned
);
非常感谢所有帮助。实际返回类型仅为
FT\u STATUS
:
typedef ULONG FT_STATUS;
ftd2x\u API
是一个宏,它使用\uuuu declspec
指令定义DLL导入/导出处理:
#ifdef FTD2XX_EXPORTS
#define FTD2XX_API __declspec(dllexport)
#else
#define FTD2XX_API __declspec(dllimport)
#endif
当API被编译成DLL时,会定义ftd2x_EXPORTS
,以便导出DLL函数。使用API时,未定义FTD2XX_导出,因此导入DLL函数
WINAPI
是windef.h
中的一个宏,它解析为调用约定(\uu stdcall
在Windows系统上):
因此,您的示例函数声明将解决此问题(包括参数类型解析):
这些类型的宏在要跨多个编译器使用和/或编译为DLL的API中并不少见。在这种情况下,导出的函数需要在实现和使用中以不同的方式声明,这还取决于目标平台甚至使用的编译器(例如,一些编译器使用
extern
/\u export
而不是\u declspec(dlliport)
/\u declspec(dllexport)
).这些类型的声明在哪里?它们可以都是没有意义的宏(例如#define ftd2x_API
),也可以映射到函数之前允许的关键字(例如u stdcall
)不,函数没有“三种返回类型”,它只有一种。WINAPI
符号是在Windows API头中定义的预处理器宏。其他两个符号可能也是预处理器宏,但在FTD2XX头中定义,您必须找到这些符号才能了解它们是什么。我的猜测是,FT_STATUS
是某种类型的宏(或类型别名),ftd2x_API
是一个declspec
编译器指令。ftd2x_API由#define ftd2x_API(dllimport)或#define ftd2x_API)declspec(dllexport)WINAPI>给出。另外两个都是在文件顶部定义的,就在ftd2x_API
的解释下面,它说“下面的ifdef块是创建宏的标准方法,可以简化从DLL导出的过程。”。
#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
);