VC编译时出现C1189 #error WINDOWS.H already included. MFC apps must not #include <windows.h>的解决方法
- 参考链接
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++”文件夹。
- 单击“高级”属性页。
- 修改“显示包含”属性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!