以下轉自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。