Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1708209
  • 博文数量: 263
  • 博客积分: 1218
  • 博客等级: 少尉
  • 技术积分: 2862
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-19 02:33
文章分类

全部博文(263)

文章存档

2020年(12)

2019年(2)

2018年(10)

2016年(1)

2015年(20)

2014年(115)

2013年(46)

2012年(37)

2011年(20)

分类: Windows平台

2014-06-13 16:15:36

以下转自CSDN论坛:

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     
           
  如果编译器在编译afxv_w32.h文件之前编译了windows.h文件,编译器会报上面的错误,因为在afxv_w32.h文件中有下面的一句预编译报警:  
  #ifdef   _WINDOWS_  
  #error   WINDOWS.H   already   included.     MFC   apps   must   not   #include    
  #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:作者也遇到了这个错误,调整头文件的编译顺序就可以解决,以上的解释很有道理,就贴到这里了^_^


在我的程序中也是: 
我有使用到  ,  ,  其中winsock2.h 和stdafx.h都有包含:
然后我们这么放包含位置:
    #include "stdafx.h"
    //如果这里用了#include就出错拉
    #include //这前两种文件自己尝试哪个放前面能用....为什么我说不上来
    #include //window.h放在最后


转:http://blog.sina.com.cn/s/blog_48ed03c80100f9bp.html
阅读(1035) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~