我在msdn的socket中定义了以下内容:
SOCKET WSAAPI socket(
__in int af,
__in int type,
__in int protocol
);
前缀“__in”是什么意思?
什么是WSAAPI?
答案 0 :(得分:4)
它是一个预处理器宏,定义为空。目的是声明接口,以便接口的用户知道函数参数的用途(就输入/输出参数而言)。
WSAAPI是Microsoft的套接字API的名称。它基于伯克利插座。
答案 1 :(得分:4)
__in
(和朋友)指定每个参数的预期用途,以便机械检查对该函数的调用。
有关如何激活检查的信息,请参阅http://msdn.microsoft.com/en-us/library/aa383701(v=vs.85).aspx。
http://msdn.microsoft.com/en-us/library/ms235402.aspx描述了现代的替代方案。
WSAAPI
扩展为用于套接字库函数的调用约定。这确保了正确生成函数调用的代码,即使调用代码设置为使用不同的调用约定构建。
答案 2 :(得分:0)
对于那些希望找到调用约定以便他们可以从另一种语言调用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。