【问题标题】:SOCKET in winsock2.h not accepted in visual studio 2017winsock2.h 中的 SOCKET 在 Visual Studio 2017 中不被接受
【发布时间】: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


【解决方案1】:

这是适用于 VS 2017 的包含顺序:

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

您也可以:

#define _FREETDS_LIBRARY_SOURCE
#include <tds.h>

【讨论】:

  • 在我们使用 tds 的 cpp 中应该遵循这个顺序吗?您没有修改 freetds lib 头文件中的任何内容吗?你用的是什么版本的freetds?
  • 适用于 freetds 版本 0.91.100,头文件没有变化。事实上,您不需要包含 WinSock2.h 和 Windows.h,因为 tds_sysdep_private.h 已经包含它们。
  • 我使用的是相同的 0.91.100 版本。是的,tds_sysdep_private.h 包括 winsoc2.h 和 windows.h。并且 tds.h 包括 tds_sysdep_private.h。因此,只包含 tds.h 是可以的,对吗?正如您在第二个选项中提到的那样。
  • 是的,只包含 tds.h 似乎是正确的,但您必须 #define _FREETDS_LIBRARY_SOURCE 因为这会导致 tds.h 包含 tds_sysdep_private.h。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2019-07-25
相关资源
最近更新 更多