什么是__in和WSAAPI?
问题描述:
我在MSDN插座的定义看到以下内容:什么是__in和WSAAPI?
SOCKET WSAAPI socket(
__in int af,
__in int type,
__in int protocol
);
什么是前缀“__in”是什么意思?
什么是WSAAPI?
答
__in
(和朋友)指定每个参数的预期用途,以便可以机械地检查对该函数的调用。
请参阅http://msdn.microsoft.com/en-us/library/aa383701(v=vs.85).aspx了解如何激活检查。
http://msdn.microsoft.com/en-us/library/ms235402.aspx描述了现代的选择。
WSAAPI
扩展到用于套接字库函数的调用约定。这确保即使调用代码设置为使用不同的调用约定构建,也可以正确生成调用函数的代码。
答
这是一个预处理宏,它被定义为什么都没有。目的是声明接口,以便接口的用户知道函数参数的用途(根据输入/输出参数)。
WSAAPI是Microsoft的套接字API的名称。它基于伯克利套接字。
答
对于那些希望找到调用约定,使他们能够从另一个调用语言WSAAPI功能,WSAAPI在Winsock2.h被定义为:
#define WSAAPI FAR PASCAL
然后在minwindef.h:
#define FAR far
#define far
#if (!defined(_MAC)) && ((_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED))
#define pascal __stdcall
#else
#define pascal
#endif
#ifdef _MAC
#ifdef _68K_
#define PASCAL __pascal
#else
#define PASCAL
#endif
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define PASCAL __stdcall
#else
#define PASCAL pascal
#endif
800的_MSC_VER是Visual C++ 1.0,这是古老的。
因此,看起来如果您正在编写Mac代码并定义了_68K_,您将获得__pascal调用约定。如果您使用Visual C++> = 1.0并为Windows开发,则是__stdcall调用约定。否则,它可能是__stdcall或者什么都不是,这取决于_STDCALL_SUPPORTED是否被定义。
因此,基本上WSAAPI可能会在您的机器上评估为__stdcall。