《深入淺出 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