VC编译时出现C1189 #error WINDOWS.H already included. MFC apps must not #include 的解决方法


  • 参考链接

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. 修改“显示包含”属性。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM