【轉(zhuǎn)載兩篇文章,不多加描述】 --------------------------------------------------------------------------------------------- 【原因分析篇: http://applehxb./logs/48742135.html】 【處理篇: http://blog.csdn.net/sunshine1314/article/details/459809】 --------------------------------------------------------------------------------------------- 【原因分析篇章】
如果在MFC工程中#include <windows.h>,那么會有以下編譯錯誤(因為afxwin.h文件中包含了afx.h,afx.h文件中包含了afxver_.h,afxver_.h中包含了afxv_w32.h,而afxv_w32.h中包含了windows.h,請看以下分析): compile error: --------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------- 一、問題由來
vc6和vc71的工程向?qū)е卸及?SPAN style="FONT-FAMILY: Times New Roman">MFC的工程,諸如win32 console project, win32 static library。非MFC工程創(chuàng)建時是不支持MFC特性的,然后我們在處理實際問題時有時會用到MFC相關(guān)類,如Cstring, Cedit等等,這是很正常的??赡苡腥藭f,為何不在一開始就創(chuàng)建MFC工程呢?問題在于MFC工程會產(chǎn)生很多向?qū)纱a,如基于單文檔的工程會有View,Doc等類,很多時候我們只需要一個空工程就可以了。
二、常見問題 非MFC工程使用MFC庫時最常見的問題就是windows.h重復(fù)包含錯誤,具體如下: fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>
三、解決辦法 非MFC工程使用MFC庫時,可參考以下步驟 1、工程設(shè)置中,將MFC的使用由原來的“使用標(biāo)準(zhǔn)windows庫”改為“在共享DLL中使用MFC”(VC71) 如果是英文版,相關(guān)選項是: Microsoft Foundation Classes: Use MFC in a shared dll, no using MFC(VC6) NOTE:因為我用的是中文版的vc71,英文版的vc6. 2、頭文件包含 不同的MFC類需包含的頭文件是不一樣的。 常用的類,如Cstring, Cedit 等,包含afxwin.h就可以了 如果不清楚包含什么頭文件的話,可以同msdn進(jìn)行查詢,msdn中,對于MFC類的介紹中,都會給出相應(yīng)的header file requirement. 3、#include 語句一定要寫在首行 這一點很重要,通常出現(xiàn)前面講到的windows.h重復(fù)包含錯誤,都是因為#include 語句沒有寫在首行。 另外還要注意的是,如果#include語句是在一個頭文件里,那么對應(yīng)頭文件的包含也要寫在首行。示例如下: ============= test.h文件的內(nèi)容如下: #include <afxwin.h> //保證該語句在首行 test.cpp的文件內(nèi)容如下: #include “test.h” //同樣也要保證該語句在首行 ============= ps: 這么做的具體原因我也不知道,我是在實際調(diào)試中琢磨出這個道理的。我自己在這個問題上花了很多冤枉時間,寫下該篇,就是希望大家不要在這個問題上絆腳。 |
|