【问题标题】:Function pointer for socket io functions send() and recv()套接字 io 函数 send() 和 recv() 的函数指针
【发布时间】:2014-08-29 07:47:09
【问题描述】:

所以我有一个名为 sockio() 的函数,它为 Winsock 1.1 中的 send() 或 recv() 函数获取函数指针,但是当我尝试将其中任何一个作为函数指针类型的参数传递时出现错误iofunc,定义如下。

我似乎无法让它们匹配,以便让我传入 send() 或 recv(),这是为什么呢?

// my function pointer typedef
typedef int (*iofunc)(SOCKET, const char*, size_t, int); 

// sockio function prototype
static int sockio(int socket, sockio_buf* buf, iofunc io); 

这是我尝试在 Visual C++ 2010 中编译时出现的错误:

1>c:\...\sockio.c(24): error C2440: 'function':
  cannot convert from 'int (__stdcall *)(SOCKET,const char *,int,int)' to 'iofunc'
1>c:\...\sockio.c(24):
  warning C4024: 'sockio': different types for formal and actual parameter 3

所有参数在我看来都是一样的。和 (__stdcall *) 位有什么关系吗?

【问题讨论】:

  • 你能显示你正在编译的c代码吗?
  • 我不知道这是否是唯一的问题,但是是的,函数指针需要声明为 stdcall。
  • 是的,解决了,谢谢 Harry 使用这个:stackoverflow.com/questions/5298394/…

标签: c visual-studio-2010 sockets function-pointers winsock


【解决方案1】:

您的typedef 缺少调用约定,因此使用C 的默认调用约定(通常为__cdecl)。 send()recv() 使用 __stdcall 调用约定:

typedef int (__stdcall *iofunc)(SOCKET, const char*, size_t, int); 

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 2019-07-14
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多