在我将其包含在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中它会显示生成错误。
答案 0 :(得分:0)
以下是与VS 2017配合使用的包含顺序:
#include <tds_sysdep_private.h>
#include <tds.h>
或者,您可以:
#define _FREETDS_LIBRARY_SOURCE
#include <tds.h>