正向声明closesocket函数中存在问题 我有一个简单的Winsock C++,我不想把整个窗口.h头或其他Winsock头包括在包装头中
这是为了减少编译时间,在ide中是轻量级的,并且避免winsock头文件之前的windows.h问题 对于大多数winsock函数来说,仅在cpp实现文件中使用它们是很困难的,让我的包装器完成简化工作 但我只需要在头文件中使用closesocket函数,就可以在套接字的raii句柄中使用它正向声明closesocket函数中存在问题 我有一个简单的Winsock C++,我不想把整个窗口.h头或其他Winsock头包括在包装头中,c++,winsock,forward-declaration,C++,Winsock,Forward Declaration,这是为了减少编译时间,在ide中是轻量级的,并且避免winsock头文件之前的windows.h问题 对于大多数winsock函数来说,仅在cpp实现文件中使用它们是很困难的,让我的包装器完成简化工作 但我只需要在头文件中使用closesocket函数,就可以在套接字的raii句柄中使用它 using socket_t = uintptr_t; using SocketHandle = std::unique_ptr<void, ZeroOrMinusHandleDeleter<so
using socket_t = uintptr_t;
using SocketHandle = std::unique_ptr<void, ZeroOrMinusHandleDeleter<socket_t, static_cast<socket_t>(-1), false, socket_t, closesocket>>;
但我得到了一个错误:C2375‘closesocket’:重新定义;不同连接
我试图消除uu declspec(dllimport)并编译了它,但出现了以下警告:
int PASCAL FAR closesocket ( IN SOCKET s);
#if INCL_WINSOCK_API_PROTOTYPES
WINSOCK_API_LINKAGE
int
WSAAPI
closesocket(
_In_ SOCKET s
);
#endif /* INCL_WINSOCK_API_PROTOTYPES */
C4273“closesocket”:dll链接不一致
我看到上一个与WinSock2.h中的定义相同:
WINSOCK_API_LINKAGE
int
WSAAPI
closesocket(
_In_ SOCKET s
);
但我不明白为什么会产生这种错误
更新:
我厌倦了叮当声,得到了这些警告
使用时
__declspec(dllimport) int __stdcall closesocket(socket_t s);
int __stdcall closesocket(socket_t s);
我得到
当使用
__declspec(dllimport) int __stdcall closesocket(socket_t s);
int __stdcall closesocket(socket_t s);
我明白了
因此,有人警告我不要在函数声明中添加或删除dllimport,这真是太神奇了
从这些警告中,我发现closesocket和其他套接字函数有两个声明
一个在winsock.h标头中,它会导致第一个警告:
int PASCAL FAR closesocket ( IN SOCKET s);
#if INCL_WINSOCK_API_PROTOTYPES
WINSOCK_API_LINKAGE
int
WSAAPI
closesocket(
_In_ SOCKET s
);
#endif /* INCL_WINSOCK_API_PROTOTYPES */
winsock2.h中的另一个会导致第二个警告:
int PASCAL FAR closesocket ( IN SOCKET s);
#if INCL_WINSOCK_API_PROTOTYPES
WINSOCK_API_LINKAGE
int
WSAAPI
closesocket(
_In_ SOCKET s
);
#endif /* INCL_WINSOCK_API_PROTOTYPES */
windows.h似乎包含winsock.h,因此当我的头包含在windows.h之后时,我会收到第一个警告
第二个警告是因为我在实现文件中包含了winsock2.h,在windows.h之前。因此,如果我逃避第一个警告,我会得到第二个警告
总之,我必须在windows.h或winsock头文件之前包含我的头文件,所以我开始讨论我试图解决的问题(包含的顺序) 查看winsock头文件,找出
winsock\u API\u链接
和WSAAPI
的含义。第一个扩展为:\u declspec(dllimport),另一个扩展为:\u stdcallNo,在windows平台中,它被定义为无符号整数ULONG_PTR,与uintptr_t一样,通过winsock头文件查找winsock_API_链接
和WSAAPI
的含义。第一个扩展为:_declspec(dllimport),另一个扩展为:_stdcallNo,在windows平台中,它定义为无符号整数ULONG_PTR,与uintptr_t相同