- 参考链接
c++ - #error WINDOWS.H already included. MFC apps must not #include <windows.h> - Stack Overflow
- 背景
因为项目需要用到Windows截屏功能,要求代码是C++的。于是使用到了VC的MFC相关的类。但是项目在编译时出现了
#error WINDOWS.H already included. MFC apps must not #include <windows.h>。
- 原因分析
在使用的MFC一些头文件中已经包含了windows.h头文件。再次声明时出现了以上错误信息。如果你在VS中双击错误信息。会带你相应的报错的头文件中。如下。
根据宏可以知道,如果声明了_WINDOWS_的话,将会报出#error后面的信息,程序编译中止。而_WINDOWS_正是windows.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
头文件windows.h,部分

#include <winapifamily.h> /*++ BUILD Version: 0001 Increment this if a change has global effects Copyright (c) Microsoft Corporation. All rights reserved. Module Name: windows.h Abstract: Master include file for Windows applications. --*/ #ifndef _WINDOWS_ #define _WINDOWS_ ......
- 解决方法
解决方法无非就是让mfc的头文件优先声明,这样在加入windows.h头文件的时候,由于windows.h中已经存在防止重复声明的宏,就不会再出错。
1.将所有 afx开头的mfc头文件放在头文件中的最前方。#include <Windows.h>放在头文件声明的最下方。
注意,编译的时候是从main函数开始的。所以,afx开头的头文件应该尽量放在main函数的头文件引用的最上方。
在调整完顺序之后,删除工程所有的debug文件和release文件。重新rebuild一次。
例子

#include <afxwin.h> #include <atlimage.h> #include <atlbase.h> #include <atlconv.h> #include <atltypes.h> #include <vector> #include <fstream> #include <ostream> #include <exception> #include <Windows.h>
2.如果你的项目很大,头文件很多的话,可能无法准确弄清楚哪个头文件先包含了windows.h头。
你可以在VS2017中,打开showIncludes选项,这样编译过程中加载头文件的顺序就会被打印出来。你可以慢慢调整。
- 项目的“属性页
- 选择“C/C++”文件夹。
- 单击“高级”属性页。
- 修改“显示包含”属性。