• error:WINDOWS.H already included错误解释


    compile   error:  
      c:program   filesmicrosoft   visual   studiovc98mfcincludeafxv_w32.h(14)   :  
      fatal   error   C1189:   #error   :     WINDOWS.H   already   included.     MFC   apps   must   not   #include   <windows.h>  
               
      如果编译器在编译afxv_w32.h文件之前编译了windows.h文件,编译器会报上面的错误,因为在afxv_w32.h文件中有下面的一句预编译报警:  
      #ifdef   _WINDOWS_  
      #error   WINDOWS.H   already   included.     MFC   apps   must   not   #include   <windows.h>  
      #endif  
       
      问题在于为什么afxv_w32.h中要有这么一句预编译处理。看了afxv_w32.h和windows.h文件就有点明白了。  
      在afxv_w32.h中有下面的预编译语句:  
      ...   ...  
      #undef   NOLOGERROR  
      #undef   NOPROFILER  
      #undef   NOMEMMGR  
      #undef   NOLFILEIO  
      #undef   NOOPENFILE  
      #undef   NORESOURCE  
      #undef   NOATOM  
      ...   ...  
      在afxv_w32.h中还有一句:  
      #include   "windows.h"  
       
      而在windows.h文件中有下面的预编译语句:  
      ...   ...  
      #define   NOATOM  
      #define   NOGDI  
      #define   NOGDICAPMASKS  
      #define   NOMETAFILE  
      #define   NOMINMAX  
      #define   NOMSG  
      #define   NOOPENFILE  
      ...   ...  
       
      注意到在windows.h的开头有防止windows.h被重复编译的预编译开关:  
      #ifndef   _WINDOWS_  
      #define   _WINDOWS_  
       
      这样问题就明白了,虽然我不知道微软为什么要这么做,但是我知道如果在afxv_w32.h没有那句预编译报警,那么如果在编译afxv_w32.h之前  
      编译了windows.h,那么在windows.h中#define的NOATOM等宏就会被#undef掉,可能会导致相应的错误发生。  
       
      猜想原因可能如上所述,我的解决方法是,将包含有#include   “windows.h"的头文件放在所有包含的头文件的最后面,这样使得对afxv_w32文件  
      的编译处理发生在先,这样,由于在afxv_w32.h中已经包含了windows.h,那么宏_WINDOWS_将被定义,后继的#include   "windows.h"语句将形同虚设,  
      上面的编译报警也不会发生了。我觉得这种处理要比将所有的#include   "windows.h”语句删掉要好一点。  
       
      一句话,编译器必须在编译windows.h之前编译afxv_w32.h,因为我不是十分清除什么时候afxv_w32.h会被编译,所以我将可能包含有#include   "windows.h"的头文件放在其他头文件之后#include。
     
    Ps:我也遇到了这个错误,调整头文件的编译顺序就可以解决,以上的解释很有道理,就贴到这里了^_^

  • 相关阅读:
    Part 17 Consuming ASP NET Web Service in AngularJS using $http
    Part 16 ng include directive in AngularJS
    Part 15 AngularJS ng init directive
    文本框
    mint上部署lamp环境
    18种有效有趣的读书方法(转载)
    可扩展的架构设计
    iisreset和w3wp的关系
    Ajax请求中带有IPv6地址后的百分号的问题
    IE中JavaScript 的异常处理
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318461.html
Copyright © 2020-2023  润新知