您的位置:首页 > 其它

VS常见错误处理:error C1189

2013-09-26 16:43 513 查看
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 */

 

查了好多资料都没有解决这个问题,希望这个问题到这里为止能圆满解决。

如果说的有不对或需要补充的地方欢迎大家更正和补充。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息