C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxv_w32.h(16) : fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>
错误提示很清楚地说明了,使用MFC,头文件afxv_w32.h中已经包含了<windows.h>,所以我们自己的代码中不在需要包含<windows.h>
步骤一:于是,我们就可以把#include <windows.h>全部给删掉。(问题可能解决)
但是,但是。。。
常常我们删掉所有的#include <windows.h>后,错误还会依旧存在;但我们已经确实删除了所有的#include <windows.h>
这种情况下 VS不会误报的,确实包含了#include <windows.h>,只是我们没有找到而已; 分析下代码吧
windows.h中如下定义
#ifndef _WINDOWS_
#define _WINDOWS_
afxv_w32.h中有如下语句:
// afxv_w32.h - target version/configuration control for Win32
#pragma once
#ifdef _WINDOWS_
#error WINDOWS.H already included. MFC apps must not #include <windows.h>
#endif
代码表明的意思很清楚,我就不解释了。至于为什么这样就不深究了。
步骤二:执行整个解决方案查找字符串“#define _WINDOWS_” 如果有找到,并且是我们自己定义的,很好,删掉它。(问题可能解决)
步骤三:查看工程属性 -- 配置属性 -- C/C++ -- 预处理器 预处理器定义,如果有_WINDOWS_” ,很好,删掉它。(问题可能解决)
通过以上步骤,我们基本可以排除不是因为我们定义了宏_WINDOWS_而引入了这个问题
但是编译器又不会欺骗我们,那么我们只能在深入思考和排查,到底是哪里包含了#include <windows.h>头文件
怀疑以下3个地方:
a.我们的代码包含; (很容易排除)
b.第三方文件包含; (很容易排除,基本不会出问题)
c.VS软件或系统自带头文件包含。(不太容易想到)
排查步骤:
1)我们在VS2008中 通过在执行查找- 查找范围锁定“整个解决方案” 查找内容 #include <windows.h> 。如果没有排除a,b
2)我们在VS2008中 通过在执行查找- 查找范围锁定“Visual C++ 包含目录” 查找内容 #include <windows.h> 。你会发现查找结果好多啊。所以问题大概明白了
肯定是你包含的其他系统头文件 从而间接 包含了#include <windows.h>,然后afxv_w32.h文件中检查到了,就报错提示。
现在你只需要找你到底包含了那个系统头文件,能删就删,不能删就调换顺序,保证 #include <afx.h> 在那个头文件之前。
比如我找了半天就发现原来我试用了头文件winsock2.h中包含了windows.h
winsock2.h文件中有如下代码。
/*
* Pull in WINDOWS.H if necessary
*/
#ifndef _INC_WINDOWS
#include <windows.h>
#endif /* _INC_WINDOWS */
查了好多资料都没有解决这个问题,希望这个问题到这里为止能圆满解决。
如果说的有不对或需要补充的地方欢迎大家更正和补充。