【发布时间】:2019-02-12 09:22:57
【问题描述】:
当我将它们包含在我的 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'
我正在尝试在使用 VS 2010 构建的 c++ 应用程序中使用 freetds 0.91.100 版本。当时没问题。
现在将我的 C++ 项目迁移到 VS 2017 后,我遇到了奇怪的错误。 我也在 VS 2017 中构建了 freetds 库。
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
我在其他线程中读到头文件包含的顺序很重要,我确保 winsock2.h 包含在 windows.h 或任何其他 windows 头文件之前。
现在来自 winsock2.h 的 SOCKET 是 typedef UINT_PTR SOCKET;
在 unsigned 中,为什么 VS 2017 无法识别类型?
构建应该像在 VS 2010 中一样顺利进行。
现在使用 VS 2017,它会显示构建错误。
【问题讨论】:
-
有人能告诉我负面评价的原因吗?
-
可能是因为您没有提供 MCVE。 stackoverflow.com/help/mcve
-
@DeepakSelvakumar 您是否在包含 tds.h 之前包含了 tds_sysdep_private.h?
-
@MarcinZawiejski tds.h 内部首先包含 tds_sysdep_private.h。所有这些都在 VS 2010 中正确构建。我不明白现在有什么区别。
-
@DeepakSelvakumar 不幸的是,如果没有 MCVE,它将无法为您提供帮助,因为根据下面的答案,它对我来说很好。
标签: c++ macros visual-studio-2017 winsock2