SOCKET в winsock2.h не принимается в визуальной студии 2017 - PullRequest
0 голосов
/ 12 февраля 2019

При получении ошибки я освобождаю заголовки, когда я включаю их в свой проект VS 2017 c ++

в 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'

Я пытаюсь использовать freetdsВерсия 0.91.100 в моем приложении c ++, которое было построено с использованием VS 2010. Тогда все было хорошо.

Теперь, после переноса моего проекта C ++ в VS 2017, я получаю странные ошибки.Я также построил lib freetds в VS 2017.

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_SYS_SOCKET в tds_sysdep_private.h,в случае сборки Windows это определяется как SOCKET, который относится к winsock2.h

. Я читал в других потоках, что порядок включения заголовочного файла важен, и я убедился, что winsock2.h включен перед windows.h.или любой другой заголовочный файл Windows.

Теперь, когда SOCKET из winsock2.h является typedef UINT_PTR SOCKET;

, что в неподписанном виде, почему VS 2017 не может распознать тип?

Сборка должна проходить гладко, как это было в VS 2010.

Теперь с VS 2017 он показывает ошибки сборки.

1 Ответ

0 голосов
/ 12 февраля 2019

Вот порядок включения, который отлично работает с VS 2017:

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

или вы можете:

#define _FREETDS_LIBRARY_SOURCE
#include <tds.h>
...