乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      MFC工程中不要#include <windows.h>

       firefox_zyw 2013-07-14

      【轉(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:   
        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文件中有下面的一句預(yù)編譯報警:   
        #ifdef   _WINDOWS_   
        #error   WINDOWS.H   already   included.     MFC   apps   must   not   #include   <windows.h>   
        #endif   
          
        問題在于為什么afxv_w32.h中要有這么一句預(yù)編譯處理??戳薬fxv_w32.h和windows.h文件就有點明白了。   
        在afxv_w32.h中有下面的預(yù)編譯語句:   
        ...   ...   
        #undef   NOLOGERROR   
        #undef   NOPROFILER   
        #undef   NOMEMMGR   
        #undef   NOLFILEIO   
        #undef   NOOPENFILE   
        #undef   NORESOURCE   
        #undef   NOATOM   
        ...   ...   
        在afxv_w32.h中還有一句:   
        #include   "windows.h"   
          
        而在windows.h文件中有下面的預(yù)編譯語句:   
        ...   ...   
        #define   NOATOM   
        #define   NOGDI   
        #define   NOGDICAPMASKS   
        #define   NOMETAFILE   
        #define   NOMINMAX   
        #define   NOMSG   
        #define   NOOPENFILE   
        ...   ...   
          
        注意到在windows.h的開頭有防止windows.h被重復(fù)編譯的預(yù)編譯開關(guān):   
        #ifndef   _WINDOWS_   
        #define   _WINDOWS_   
          
        這樣問題就明白了,雖然我不知道微軟為什么要這么做,但是我知道如果在afxv_w32.h沒有那句預(yù)編譯報警,那么如果在編譯afxv_w32.h之前   
        編譯了windows.h,那么在windows.h中#define的NOATOM等宏就會被#undef掉,可能會導(dǎo)致相應(yīng)的錯誤發(fā)生。   
          
        猜想原因可能如上所述,我的解決方法是,將包含有#include   “windows.h"的頭文件放在所有包含的頭文件的最后面,這樣使得對afxv_w32文件   
        的編譯處理發(fā)生在先,這樣,由于在afxv_w32.h中已經(jīng)包含了windows.h,那么宏_WINDOWS_將被定義,后繼的#include   "windows.h"語句將形同虛設(shè),   
        上面的編譯報警也不會發(fā)生了。我覺得這種處理要比將所有的#include   "windows.h”語句刪掉要好一點。   
          
        一句話,編譯器必須在編譯windows.h之前編譯afxv_w32.h,因為我不是十分清除什么時候afxv_w32.h會被編譯,所以我將可能包含有#include   "windows.h"的頭文件放在其他頭文件之后#include。


      ---------------------------------------------------------------------------------------------

      ---------------------------------------------------------------------------------------------


      【處理篇】


      一、問題由來

       

      vc6vc71的工程向?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 MFCVC6

      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)試中琢磨出這個道理的。我自己在這個問題上花了很多冤枉時間,寫下該篇,就是希望大家不要在這個問題上絆腳。


        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多