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
View Code
复制代码

 头文件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_
......
View Code
复制代码

 

  • 解决方法

解决方法无非就是让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>
View Code
复制代码

 2.如果你的项目很大,头文件很多的话,可能无法准确弄清楚哪个头文件先包含了windows.h头。

你可以在VS2017中,打开showIncludes选项,这样编译过程中加载头文件的顺序就会被打印出来。你可以慢慢调整。

  1. 项目的“属性页
  2. 选择“C/C++”文件夹。
  3. 单击“高级”属性页。
  4. 修改“显示包含”属性。

 

posted @   逃跑的红薯  阅读(5244)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示