问题描述

当你的项目是MFC程序,并包含某些自己写的头文件时,一定遇到过如下错误:

fatal error C1189: #error :  WINDOWS.H already included.  
MFC apps must not #include <windows.h>

当你第一次遇到这个编译问题时,大家都会觉得非常奇怪,怎么会出现这么奇葩的编译错误;我已经遇到过好几次,直接最近一次才明白其中的原因。

根据原因是在#include stdafx.h文件之前,你直接或间接包括了windows.h导致的,而在stdafx.h文件中间接包含afxv_w32.h头文件

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件

#pragma once

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
#endif

#include "targetver.h"

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的

// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏
#define _AFX_ALL_WARNINGS

#include <afxwin.h>         // MFC 核心组件和标准组件
#include <afxext.h>         // MFC 扩展

#include <afxdisp.h>        // MFC 自动化类

#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h>           // MFC 对 Internet Explorer 4 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>             // MFC 对 Windows 公共控件的支持
#endif // _AFX_NO_AFXCMN_SUPPORT

#include <afxcontrolbars.h>     // 功能区和控件条的 MFC 支持

问题分析

Windows.h文件部分内容如下:

#ifndef _WINDOWS_
#define _WINDOWS_

afxv_w32.h部分文件内容如下:

#pragma once

#ifdef _WINDOWS_
	#error WINDOWS.H already included.  MFC apps must not #include <windows.h>
#endif

因为Windows.h文件中没有定义_WINDOWS_则定义_WINDOWS_宏,而在afxv_w32.h文件中检测到定义了_WINDOWS_则打印错误信息,这个信息就是编译器编译错误信息。

验证问题

当我们在MFC工程属性中添加_WINDOWS_宏定义,也可以出现相同的错误。

在这里插入图片描述
问题解决,bingo!!!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐