VS2013使用winsock.h和winsock2.h发生冲突后的终极解决方法
问题:彻底无语了,不小心某个文件包含了windows.h头文件,而windows.h文件里面包含着winsock.h文件,
如果你下次使用winsock2.h文件时,位置不对,然后编译器会给你一大堆重定义错误问题。
初级解决办法:
把winsock2.h文件放在任何可能包含winsock.h文件(尤其是windows.h文件,它就包含了winsock.h文件)的前面,因为winsock2.h头文件有这样的宏定义:
#ifndef _WINSOCK2API_
#define _WINSOCK2API_
#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */
如果在winsock2.h之后再引用winsock.h头文件,那么winsock.h文件并没有什么卵用。
在生成应用程序时,即使不是MFC应用程序,也有有这个东西:

而网上对stdafx.h文件的解释是:把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。
可怕的是它包含了windows.h文件,然而并不可怕的是:当我们使用AppWizard来自动生成某些项目的时候,系统会自动把所需要include的头文件在stdafx.h中先include一下,这样,我们只需要直接include这个stdafx.h文件即可。只在使用AppWizard来自动生成项目的时候,才出现.否则,就没有必要include此头文件stdafx.h了。参考网页。
所以如果是MFC等windows窗口项目,需要把stdafx.h预编译头删掉,否则其它应用删不删都无所谓了。
但是……但是……但是……即使我采取了以上办法,并一一追踪我自己写的头文件,看了看winsock.h和winsock2.h包含的先后关系,都满足了winsock2.h在前的关系了,但是仍然有重定义,这个时候我看到另外一篇文章,里面提到【但当我在一个wxWidgets中调用它时,又出现那个让人厌烦的错误 ““sockaddr”: “struct”类型重定义,明显是wxWidgets先包含了windows.h,现在头都大了,楞想不到怎么解决,在所有文件最开头定义_WINSOCK2API_都没用】,只想说呵呵了。人家要是愣是在最初给你先包含了windows.h文件(就譬如MFC中的stdafx.h头文件),那你也没辙了是吧。
终极办法:
然而,天无绝人之路,终极办法是:添加WIN32_LEAN_AND_MEAN宏定义,直接在vs的设置里预先添加这个宏定义就ok啦:

那么,这个奇怪的宏定义是干嘛的,查了一些资料后,是这么说的【 不加载MFC所需的模块。在编译链接时,以及在最后生成的一些供调试用的模块时,速度更快,容量更小。】好多地方都是这么说的,就不给链接了,有兴趣的自己搜搜这个宏吧。
然而,我仍然疑惑的是,我在哪里加载MFC所需的模块了,其实我挺好奇上面那个图中_WINDOWS这个宏是干嘛,但是暂时没有搜到相关资料。
总结:其实大家也看到了,其实所谓的终极办法也只能解决这种非MFC的应用程序的问题,至于其他情况出现这种问题的话,我还没有去探索,毕竟还没有遇到嘛。
感慨:下面这些选项在不了解情况的时候不要瞎选哈:

还有那个SDL检查,个人建议不要选,因为windows上有它自己的一套_s的安全函数,否则,你就各种编译不通过,还得改为它的_s(safe)函数,这个时候你要修改的东西多了。当然,这个sdl检查还是有用的,毕竟人家的函数毕竟比较safe嘛,然而上次使用vsnprinf_s函数的时候,因为它提供额外参数问题,这个参数的错误导致我的程序里出现了莫名其妙的错误,都是泪。
要不是因为被要求使用vs做开发,我也不会去用它,个人还是钟情于linux平台的东西。vs开发为了让开发更简单,更傻瓜式,它默默的帮你干了很多事情,等你出错的时候,你就干瞪眼吧。也因为各种IDE的使用,很多程序员不了解整个编译流程,总是习惯一键build。当然,各有各的好,各有各的适用情况,我个人偏好使用gcc罢了。
VS2013使用winsock.h和winsock2.h发生冲突后的终极解决方法的更多相关文章
- 【VS开发】winsock 错误多 windows.h和winsock2.h的顺序
Windows平台下用C++做网络开发很多时候都会同时包含这两个头文件,如若顺序不当(windows.h先于winsock2.h)就会出现很多莫名其妙的错误.诸如: c:\program files ...
- 解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载
解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载 当这两个头文件顺序颠倒时,编译会出现许多莫名其妙的错误,错误如下: 1>…\include\ws2def.h( ...
- windows.h和winsock2.h包含顺序问题(转)
windows.h和winsock2.h有类型重定义我是知道的,本来就一个库来说没问题,把winsock2放到windows.h前或先定义WIN32_LEAN_AND_MEAN都能解决问题但现的出了问 ...
- winsock.h与winsock2.h出现重定义或不同的链接
经常遇到编译socket程序的时候生成几百个错误 以下是出错后的错误信息: >c:\program files\microsoft sdks\windows\v6.0a\include\ws2d ...
- windows.h和WinSock2.h出现重定义API
有两种常用的解决方法:1.把WinSock2.h写在windows.h之前 2.使用宏定义#define WIN32_LEAN_AND_MEAN
- 解决 MVC4 Code First 数据迁移 数据库发生更改导致调试失败解决方法(二)
文章转载自:http://www.cnblogs.com/amoniyibeizi/p/4486617.html 前几天学MVC过程中,遇到更改Model类以后,运行程序就会出现数据已更改的问题导致调 ...
- windows.h与winsock2.h的包含顺序
#define WIN32_LEAN_AND_MEAN #include <windows.h>
- #import </usr/include/objc/objc-class.h> not such file or directory问题的解决方法
近期在使用一些开源的demo,打开后出现这个错误,然后能够把 #import </usr/include/objc/objc-class.h> 改动为以下 #import <objc ...
- 64位系统中fatal error: stdio.h: 没有那个文件或目录的错误的解决方法
Ubuntu系统中可输入如下命令,安装开发环境: sudo apt-get install build-essential https://blog.csdn.net/yygydjkthh/artic ...
随机推荐
- Galaxy Classification
10.3 Data Preparation After removing a large number of the columns from the raw SDSS dataset, introd ...
- [蟒蛇菜谱]Python获取任意xml节点的值
# -*- coding: utf-8 -*- import xml.dom.minidom ELEMENT_NODE = xml.dom.Node.ELEMENT_NODE class Simple ...
- Windows CMD下一些有用的命令
2014.06.27 C:\Users\wsc>route print ============================================================= ...
- ACM感悟
声明:本文是写给弱校ACM新手的一点总结,受自身水平和眼界所限,难免会有一些个人主观色彩,希望大牛指正 感谢@Wackysoft .@哇晴天 . @ 一切皆有可能1 的指教,现根据这些建议,文章已进行 ...
- 12-1 mysql的增删改减
增加数据:insert into 表名 values('','');insert into 表名(列名) values('');注意:1.如果添加 得数据是字符串,需要加'',其他类型不要加. 2.添 ...
- Linux------小网盘(1)
一:要求 利用Linux Socket进行文件传输,本次只支持client端向sever端上传文件 二:实现提示: client.c client的参数有两个,分别是服务器主机名和端口: 在while ...
- iOS开发之Objective-C与JavaScript的交互(转载)
UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS ...
- 无锁队列以及ABA问题
队列是我们非常常用的数据结构,用来提供数据的写入和读取功能,而且通常在不同线程之间作为数据通信的桥梁.不过在将无锁队列的算法之前,需要先了解一下CAS(compare and swap)的原理.由于多 ...
- Python 基礎 - for流程判斷
今天介紹另一個循環判斷式 for循環,首先,先寫一個很簡單的 for循環的代碼 #!/usr/bin/env python3 # -*- coding:utf-8 -*- for i in range ...
- (实用篇)PHP定时任务获取微信access_token
最近开发微信公众平台,公众号调用各接口时都需使用access_token,access_token是公众号的全局唯一接口调用凭据,开发时需要进行妥善保存. access_token有效期为7200秒 ...