error:WINDOWS.H already included錯誤解釋

以下轉自https://blog.csdn.net/wxqian25/article/details/19042805

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章