关于 WinSock2.h 与 WinSock.h 文件重定义冲突的 解决办法

简介:

事实上一直都用的是Winsock1的,还从来没有用过Winsock2,今天开始使用它,但是出现了一大堆的错误,都是那个C2011和C2375之类的错误。当时就想,是不是2和1发生了冲突了?但是我没有包含过1的头文件啊?!
后来一查,在Windows.h里面发现了这么一段代码:

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

我就一个倒。。。。
原来是这里包含了。。。。
对付这个的终极解决办法是:

#define WIN32_LEAN_AND_MEAN 
#include <Windows.h>

即是在包含Windows.h前加入#define WIN32_LEAN_AND_MEAN这条语句,它能够将上面的语句包含winsock.h的语句消减掉。

后面在网上看到另外一种解决方案,其代码如下:

#ifndef _WINSOCKAPI_            //  没有包含winsock.h
#define _WINSOCKAPI_            //  避免再包含winsock.h
    #ifndef _WINSOCK2API_       //  没有包含winsock2.h
     #define _WINSOCK2API_       //  避免再包含winsock2.h
        #include <winsock2.h>
        #pragma comment(lib, "ws32_2.lib")
     #endif
#endif

其实这个代码是有缺陷的,如果是先包含的windows.h,然后再包含这段语句的,事实上,这个语句什么事情都没有做,是一条废语句,要想它有用,就必须在包含windows.h之前包含这段语句所在的头文件。事实上,这个解决方案不是很好的。 
使用这个方法,必须要注意的是:必须在包含Windows.h头文件之前使用它,否则很有可能是无效的,当然如果您在包含Windows.h之前使用了#define WIN32_LEAN_AND_MEAN,那么,自然它还是有效的了。这是治标不治本的一个办法。
目录
相关文章
|
6月前
|
C语言 C++
boost库asio编译及配置
boost库asio编译及配置
272 0
|
编译器 C++
初识 C++(头文件,调试模式区别总结)
初识 C++(头文件,调试模式区别总结)
|
编译器 C语言
宏、条件编译(#ifdef)、#include(头文件包含)、#error和 #pragma的区别、#和##的含义和应用
宏、条件编译(#ifdef)、#include(头文件包含)、#error和 #pragma的区别、#和##的含义和应用
106 0
|
编解码 缓存 C++
C++ <windows.h>库函数探究初步:句柄操作
C++ <windows.h>库函数探究初步:句柄操作
9721 0
|
编译器 程序员 C++
c++语言程序设计——头文件和引用系统头文件、用户头文件的定义及使用方法
c++语言程序设计——头文件和引用系统头文件、用户头文件的定义及使用方法
c++语言程序设计——头文件和引用系统头文件、用户头文件的定义及使用方法
|
C++
so运行出错:只包含了头文件,未同时编译cpp
so运行出错:只包含了头文件,未同时编译cpp
124 0
自动初始化 winsock
自动初始化 winsock
1113 0