精華區beta CompBook 關於我們 聯絡資訊
《深入淺出 MFC》答客問 (2) 侯捷 jjhou@ccca.nctu.edu.tw 1999.10.29 第一次發表於 清大.楓橋驛站(140.114.87.5).電腦書訊版(Computer/CompBook) 本文將於日後整理於 侯捷網站/作品勘誤/《深入淺出 MFC》/答客問 侯捷網站:www.jjhou.com ---------------------------------------------------------------- shiowli wrote (1999/10/27) > 致敬愛的侯俊傑先生: > > 經過了一年多都沒給先生寫信, > 真是不好意思。但更遺憾的是這些日子 > 不聞先生出書訊 只聞 Wndows2000 (TM) 聲啾啾 > 先生什麼時候才會再出書,以饗讀者呢? > > 想請教先生一些觀念問題: > > 1. 在看過一些工程師所寫的 MFC source codes > 後,我發覺 RUNTIME_CLASS 及 Dynamic Creation > 並不會被大部分台灣的工程師所利用。想請教先生 > RUNTIME_CLASS 及 Dynamic Creation 使用的時機 > 及如何使用?(如宣告 static CRunimeClass pointer) > > 2. 使用 AppWizard Project file 中想要加入 .cpp file > 在 Compiling 過程會被要求請加入 "stdafx.h" > 請問可以避免嗎? > > 再次謝謝 侯先生 侯捷回覆: 的確,我也和不少工程師討論過,他們的 MFC 程式為什麼沒有運用 RUNTIME_CLASS 和 DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE… 等等 macros。原因有二: (另一組形式類似的 macros 是 MESSAGE MAP 的相關 macros。但這一組 沒人敢刪,且其功能較具體,近程可見,所以比較沒什麼問題) 1. 不瞭解這些 macros 的意義,所以不知道怎麼用。一開始會依樣畫葫蘆, 但後來畫得不太好,也不知怎麼變化(因為葫蘆有三種)。偶然情況下 把葫蘆拿掉,發現好像有時候也能 work。但是當需要如 dynamic creation 或 serialization 等功能時,又發現糟糕(但不知道糟糕的真正原因)。 所以情況變得有點混亂,開始挖東牆補西牆,開始做苦功。 2. 也許後來瞭解了這些 macros 的意義與用法與變化,但是 project 已經進行兩年,大牛難翻身,而且苦功也做了一些,個人辛苦結晶 沒派上用場甚覺可惜,所以就繼續保持不甚理想的現況。 在 MFC 這個龐大的 framework 中,為了遂行它的一些基礎公共建設 (infrastructure),所以設計出這些形式極為簡單,但實際內容甚為 複雜的 macros。我們開發 MFC appliciations 時,如果要運用諸多美好 性質,必須從根本上瞭解這些 macros 的用法,適當地運用它們。當然, 要根本瞭解其用法,最好是對其意義有相當程度的認識。 你問我: > 想請教先生 RUNTIME_CLASS 及 Dynamic Creation 使用的時機 > 及如何使用?(如宣告 static CRunimeClass pointer) 書上有的東西,我就不在板上重彈了。況且講來長篇大論。 關於這些 macros 的使用時機和方法,許多 VC/MFC 書籍都有提到。 如果你要深入瞭解 why 而不只是 how,以及深入瞭解那些 macros 如何展開其驚人的動作,可參考《深入淺出 MFC》chap8, chap9, 或是《多型與虛擬》chap5。前者直接拿 MFC source 來說明, 後者呈現一個可在 console mode 中執行的 MFC-lite,比較精簡。 瞭解這些 macros 的副作用是,可以對 C++ 的 operator # 和 operator ## 有更多的認識,並稍窺其威力。也可以對於「如何建構 一個 framework 的基礎公共建設(infrastructure)」有不小的幫助。 你的第二個問題: > 2. 使用 AppWizard Project file 中想要加入 .cpp file > 在 Compiling 過程會被要求請加入 "stdafx.h" > 請問可以避免嗎? 你是問「一個 project 之中可否不要 stdafx.h」嗎?答案是可以, 但你的日子會從此更辛勞些。 隨便看一個由 AppWizard 產生的 project,其 stdafx.h 內是一些 必要的 include files(例如 afxwin.h)。對應於 stdafx.h 則有 一個 stdafx.cpp,其內只是 #include "stdafx.h"。這有什麼用意? 用意是,讓 stdafx.cpp 編譯出一個 stdafx.obj,成為 所謂的 "pre-compile-header"(需搭配特殊 compile option。 AppWizard 會為我們的 project 自動設定這個特殊的 option), 可大幅降低第二次(以降)的編譯所需時間(因為標準 MFC headers 不需再編譯一次)。 往後,你每使用 ClassWizard 協助開發此程式,ClassWizard 便有 可能在 stdafx.h 中增加新的 include files。例如,你若選用 MFC template classes,stdafx.h 中便會增加 #include <afxtempl.h>。 如果你不要 afxstd.h,意味你得自己 take care 這些事情。 --- the end  -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ Mail: jjhou@ccca.nctu.edu.tw