什么是__in和WSAAPI?

时间:2011-02-11 19:35:32

标签: c++ sockets

我在msdn的socket中定义了以下内容:

SOCKET WSAAPI socket(
  __in  int af,
  __in  int type,
  __in  int protocol
);

前缀“__in”是什么意思?

什么是WSAAPI?

3 个答案:

答案 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。