Visual Studio 2017不接受Winsock2.h中的SOCKET

时间:2019-02-12 09:22:58

标签: c++ macros visual-studio-2017 winsock2

在我将其包含在VS 2017 c ++项目中时出现错误,我将freetds标头包含在内

在tds.h中将其包含在项目中时

    include\tds.h(1331): error C3646: 's': unknown override specifier
    include\tds.h(1331): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    include\tds.h(1641): error C2065: 'TDS_SYS_SOCKET': undeclared identifier
    include\tds.h(1641): error C2146: syntax error: missing ')' before identifier 's'

我试图在使用VS 2010构建的c ++应用程序中使用freetds 0.91.100版本。那很好。

现在,在将C ++项目迁移到VS 2017之后,我遇到了奇怪的错误。 我在VS 2017中也建立了freetds lib。

freetds在tds_sysdep_private.h中具有此声明

#if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32)
typedef int TDS_SYS_SOCKET;
#define INVALID_SOCKET -1
#define TDS_IS_SOCKET_INVALID(s) ((s) < 0)
#else
typedef SOCKET TDS_SYS_SOCKET;
#define TDS_IS_SOCKET_INVALID(s) ((s) == INVALID_SOCKET)
#endif

而tds.h具有

struct tds_socket
{
TDS_SYS_SOCKET s;       /**< tcp socket, INVALID_SOCKET if not connected */
}

错误在于此TDS_SYS_SOCKET声明

我的代码通过这种方式包含此标头。

tdsloader.h

using namespace std;
#if defined (__cplusplus)
extern "C" {
#endif
#include "tds.h"
#if defined (__cplusplus)
}
#endif

根据tds_sysdep_private.h中TDS_SYS_SOCKET的声明,如果使用Windows构建,则将其定义为来自winsock2.h的SOCKET

我在其他线程中读到头文件包含的顺序很重要,并且我确保在Windows.h或任何其他Windows头文件之前包含winsock2.h。

现在,来自winsock2.h的SOCKET是      typedef UINT_PTR SOCKET;

其中一个未签名,为什么VS 2017无法识别类型?

构建应该像在VS 2010中一样顺利进行。

现在在VS 2017中它会显示生成错误。

1 个答案:

答案 0 :(得分:0)

以下是与VS 2017配合使用的包含顺序:

#include <tds_sysdep_private.h>
#include <tds.h>

或者,您可以:

#define _FREETDS_LIBRARY_SOURCE
#include <tds.h>