Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_Return - Fatal编程技术网

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
);