正向声明closesocket函数中存在问题 我有一个简单的Winsock C++,我不想把整个窗口.h头或其他Winsock头包括在包装头中

正向声明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

这是为了减少编译时间,在ide中是轻量级的,并且避免winsock头文件之前的windows.h问题

对于大多数winsock函数来说,仅在cpp实现文件中使用它们是很困难的,让我的包装器完成简化工作

但我只需要在头文件中使用closesocket函数,就可以在套接字的raii句柄中使用它

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相同