error:WINDOWS.H already included错误解释

compile    error:  
   c:\program    files\microsoft    visual    studio\vc98\mfc\include\afxv_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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值