zoukankan      html  css  js  c++  java
  • VS winsock.h和ws2def.h大量重定义报错的问题

    报错原因:

      我们知道,Windows网络编程至少需要两个头文件:winsock2.h和windows.h,而在WinSock2.0之前还存在一个老版本的winsock.h。正是这三个头文件的包含顺序,导致了上述问题的出现。

    winsock2.h的内容,在文件开头有如下宏定义:

    #ifndef _WINSOCK2API_
    #define _WINSOCK2API_
    #define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */
    
    ......
    中间已省略
    ......
    
    /*
     * Pull in WINDOWS.H if necessary
     */
    #ifndef _INC_WINDOWS
    #include <windows.h>
    #endif /* _INC_WINDOWS */

    这是最常见的防止头文件重复包含的保护措施。
    _WINSOCKAPI_的定义阻止了对老文件winsock.h的包含
    即是说,如果用户先包含了winsock2.h就不允许再包含winsock.h了,
    后半段作用是:如果用户没有包含windows.h(_INC_WINDOWS在windows.h中定义)就自动包含它,以定义WinSock2.0所需的类型和常量等。

    现在切换到windows.h,我们会的发现以下内容:(注:这里是MS的Platform SDK中的windows.h与VC自带的文件存在差异)

    #ifndef _MAC
    #include <winperf.h>
    #include <winsock.h>
    #endif
    

    其实很容易理解,文件间相互包含,而的定义顺序导致了winsock在winsock2之前被包含,就会导致大量重复定义的错误。

    解决:

    找到代码中包含windows.h和winsock2.h的地方,让winsock2在windows之前被包含就行了
    (或者专门写个头文件,用于解决这个问题)

    在stdafx.h中加入:

    #include <WinSock2.h>
    #include <windows.h>

    就可以解决了。

    如果发现解决方案里并未发现包含这两个文件,可以那么很有可能是使用的开发包或者其他文件中使用了内容。

    (参考博客:https://blog.csdn.net/weixin_43956221/article/details/117217614)

  • 相关阅读:
    C# 自定义泛型类,并添加约束
    WPF DataGrid 的RowDetailsTemplate的使用
    jquery腾讯微博
    WPF DataGrid的LoadingRow事件
    WPF DataGrid自定义列DataGridTextColumn.ElementStyle和DataGridTemplateColumn.CellTemplate
    WPF DataGrid支持的列类型
    WPF DataGrid自动生成列
    WPF DataTemplateSelector的使用
    WPF数据模板的数据触发器的使用
    UVa 1601 || POJ 3523 The Morning after Halloween (BFS || 双向BFS && 降维 && 状压)
  • 原文地址:https://www.cnblogs.com/Brickert/p/15733090.html
Copyright © 2011-2022 走看看