有了const和inline,宏定義就‘光榮退休了’嗎?

 

有了constinline,宏定義就‘光榮退休了’嗎?

我的書稿還對流行的教科書存在的一些問題進行了探討,例如‘++’運算符重載函數的返值問題等。筆者相信,連教科書都會出現的問題一定具有探討的必要。

在書稿中隱去了發生問題的教科書的名字,但是在博客文章中我將指出這些書的名字。

經濟科學出版社2000年出版的全國高自考指定教材《面向對象程序設計》,作者是中國科技大學的教授劉振安、ISBN:7-5058-1997-6/G.422。第6頁倒數第6行說:“在C++中,由於const修飾符和內聯函數的引入,無論是帶參數的宏還是不帶參數的宏,都失去了存在的必要。也就是說,它們可以‘光榮退休了’”。這種說法是草率和錯誤的。

我們知道,語句constdouble PI=3.14;完全能代替預處理命令#definePI 3.14,但僅此而已,到目前爲止,帶參數的宏絕不是其它的東西能代替的。編譯器能夠把語句映射成指令,而帶參數的宏卻能生成語句。

儘管我們甚至能用C語言通過WindowsAPI接口函數書寫windows程序,但現在恐怕沒有人這樣做。人們經常使用的方法之一是使用Visual C++的集成環境的AppWizard生成一個基於MFC類庫的應用程序框架而不必進行任何的編程。這個框架能夠運行但不具備解決任何問題的功能。程序員可以在這個框架的基礎上增加解決問題的功能從而使得程序員節省了大量的時間和精力。

雖然可以不讀懂應用程序框架,僅使用AppWizardClassWizard工具添加類和成員函數一般就可以做出滿足功能要求的程序,但是對一個優秀的程序員來說,對應用程序框架有一個基本的理解是十分有益的。不僅僅做出AppWizardClassWizard實現不的事,更好的使用這個框架,而且這個框架簡直就是面向對象編程的最經典的案例和範本。倘若能對這個框架有一個比較深入的理解,你會歎爲觀止並有醍醐灌頂的感覺。你會覺得就像那在太上老君爐子裏煉過七天七夜的孫猴子,你也變成火眼金睛了。你會有脫凡成仙的飄飄然之感。有興趣的讀者請閱讀臺灣專家侯捷的經典著作《深入淺出MFC》。本書要講的僅僅是應用程序框架的幾個宏。

筆者用AppWizard產生一個產生一個工程,名曰chen。其中有代碼如下:

//chen.cpp

BEGIN_MESSAGE_MAP(CChenApp, CWinApp)

         ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

         ON_COMMAND(ID_FILE_NEW,CWinApp::OnFileNew)

         ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen)

END_MESSAGE_MAP()

上面的代碼簡直像簡明的文章。好像在說:

下面開始_建立一個信息_

         如果你點擊ID_APP_ABOUT,則去執行命令OnAppAbout

         如果你點擊ID_FILE_NEW,則去執行命令CWinApp::OnFileNew

         如果你點擊ID_FILE_OPEN,則去執行命令CWinApp::OnFileOpen

現在結束_建立信息_

上面的帶‘ID_’的是資源的標識,所謂資源就是菜單、按鈕之類;所謂標識就是代號,就像學生的學號。ON_COMMAND(…, …)的個數任意,你可以使用Wizard或者乾脆按照這個格式自己寫去增加。

你能想象嘛?這些寓意明顯的黑體字都是宏,帶參數的宏。

其中,宏BEGIN_MESSAGE_MAP(theClass,baseClass)爲:

//AfxWin.h

#define BEGIN_MESSAGE_MAP(theClass, baseClass) \

         const AFX_MSGMAP*PASCAL theClass::_GetBaseMessageMap() \

                   { return&baseClass::messageMap; } \

         const AFX_MSGMAP*theClass::GetMessageMap() const \

                   { return&theClass::messageMap; } \

         AFX_COMDAT AFX_DATADEFconst AFX_MSGMAP theClass::messageMap = \

         {&theClass::_GetBaseMessageMap, &theClass::_messageEntries[0] }; \

         AFX_COMDAT constAFX_MSGMAP_ENTRY theClass::_messageEntries[] = \

         { \

ON_COMMAND(id,memberFxn)爲:

//AfxWin.h

#define ON_COMMAND(id, memberFxn) \

         { WM_COMMAND,CN_COMMAND, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)&memberFxn },

END_MESSAGE_MAP()爲:

//AfxWin.h

#define END_MESSAGE_MAP() \

                   {0, 0, 0, 0,AfxSig_end, (AFX_PMSG)0 } \

         }; \

 

我們看到,這些宏由預處理系統轉換成了一大堆上面黑體字標出的複雜的語句。

當我們增加好理解的宏ON_COMMAND(id,memberFxn)後,預處理語句就會生成不好理解的代碼。正是有了這個宏這個利器,才使得衆多看不懂應用程序框架的人照樣能編出相當高水平的程序。這也就是說,宏和你一起便程序。如果宏真的‘光榮退休’了,那可糟了。

幫你寫程序的宏不能被代替,但是另一種能代替函數,從而省去函數調用時間的宏卻真可能被內聯函數所代替。請看下例:

#include <iostream.h>

#definemax(i,j) ((i)>(j)?(i):(j))

int main( )

{       intx=3,y=5;

         cout<<max(x,y)<<endl;

         return0;

}

雖然我們在主函數裏寫成函數調用形式max(x,y),但實際運行時並沒有函數調用過程,起到的作用與內聯函數類似。

 

----------------------------------------------作者聲明-----------------------------------------

我是一個老頭,65歲,編過10年程序,在大學教過15年書,寫了一本書,名爲《C++釋難解惑》,這幾年來一直在投稿。出版社對我的書稿評價很好,但他們就是由於經濟上的風險。總是在出版的最後關頭反悔。其中北京****出版社已經簽字畫押的情況下反悔;北京****出版社與我簽過電子合同;書稿在**大學出版社放了9個月,還讓我請名人寫序言,最後說現在書很難賣,並且還給我發了個近半年的圖書銷售的excel文檔讓我看,希望我理解出版社。我只好仰天嗟嘆了。

有編輯朋友建議我把書稿放到網上讓讀者試讀,以印證讀者的人數和滿意度。我想這是一個辦法,即使永遠不能出版,也不至於爛在肚子裏。並且我在網上也看到這個辦法成功的先例,例如《C語言深度解剖》,後來就由北航出版社出版了。

C語言深度解剖》的作者採用的方法是把書稿上傳到網上。我想採用化整爲零的方法,每週起碼在我的CSDN博客裏發一篇文章,是書稿裏的內容稍加改造的。之所以這樣做確實出自於私心,就是想借此賺取CSDN的積分。因爲我以前忙於教書,無暇經常光顧CSDN,所以幾乎沒有積分,這樣是不能被大家所認識的。

博文與書稿上的文字可能有極少的字面上的不同。

如果您對我的書稿和博文感興趣,請您推薦給您的朋友,謝謝。

本書稿已經國家版權保護中心進行了作品登記,登記號爲:2010-A-023237

下面我把一些出版社給我的來信摘錄作爲參考。您可以看到,我的書名在不同的出版社和編輯面前改了好幾次名了,現在書稿的名字是我自己的。

//-----------------------------------以下是**大學出版社編輯的來信---------

陳老師,

    選題我暫以《C++釋疑解惑:課本沒講透的131個問題》的名字報上去了。通過審批應該問題不大。下面幾點,是咱們電話裏說過的,麻煩你着手進行啊:)

 

//-----------------------------------------------------------------------------------------------------------

陳老師好

從您的來信,我覺得您的文字駕馭能力挺好的,如果您的書,能寫成您給我來信的風格,也不錯,現在市場上還就缺這樣的書。那種一步步講操作,枯燥的原理,確實沒人願意看,而那種語言比較生動,穿插一些開發故事,體會心得之類的文風,讓冰冷的技術活了起來,容易引起讀者的共鳴。所以,建議書至少300頁,寫得生動些,多配些圖,甚至每章最後都可以增加上一些問答,比如您歷年教學收集到的經典問題等等。當然,其他的一些方法,也都可以嘗試,我這裏只是拋磚引玉。

 

//----------------------------------------------------------------------------------------------------------

尊敬的陳老師:您好!

由於負責這本書的編輯已經離職,這本書現由我負責與您溝通及出版事宜。

這本稿件從市場上鮮有的寫作角度出發,揭示了C++的很多難點,有些內容具有一定的深度,同時又力求在寫作上深入淺出,會有一定量的讀者關注書中的問題,這是本書的一大特色

//-------------------------------------------------------

 

陳老師:您好!

  今天,就這部書稿又與領導進行了溝通。從這部書稿可看出,其中積澱了您多年的經驗和大量心血,力圖爲讀者學習C++排疑解惑,實屬難能可貴。

 從現在的銷售數據(開卷數據:專門的圖書銷售調查數據,採集自全國2000多家書店,隨郵附上)看,目前市場上同類書整體銷量不理想(月銷200本以上較好),即便在這樣的數據面前,相對好銷的書還屬於基礎入門的書或教材。在此,也冒昧地想和您探討,如何將此書出銷好的辦法,比如:您能幫助出版社做哪些宣傳推廣,或者利用院校資源推廣銷售,以及在零售書店怎樣做宣傳,才能讓讀者廣泛知曉本書並認可,從而形成銷售。

 

 

//------------------------------------------------------------------------------------------

 

陳老師:您好!

 

     從來信看到您對開卷銷售數據進行了詳細分析,相信您也看出零售圖書市場的銷售狀況,即便是第1名的圖書也不過160/月,假設書店與網店銷量平分秋色,每月的總銷量也只有320本,一年的銷量爲3840冊,按計算機書的平均銷售週期一年半計算,預計爲5760冊(純零售不包括教材)。以此推算,當月銷量在100本的書,預計3600冊。這個銷量如果沒有教材的銷量支撐,從出版社的成本計算基本上是沒有什麼利潤的,如果計算上在途、退貨等因素,稍有不慎恐怕就會虧本,這基本上就是純零售書的狀況。

 

     信中提到的幾位作者的書,銷量多則50多本,少則幾本,如果純靠零售銷售的話,簡單可以看出最終銷量的情況。

 

     社裏對您這本書的含金量一直都是肯定的,只是苦於店銷圖書的銷售狀況,也深知您的身體狀況在寫作上將要付出的巨大努力,覺得再讓您改稿實在是有些不合適。

 

 

//-------------------**大學出版社電子出版物編輯的來信--------------------------

陳老師您好:

     我與圖書編輯溝通了,就如您告訴我的,他對本書的質量不持疑義,主要考慮的是本書的經濟效益。我們作爲電子出版和網絡出版部門,還沒出過單獨的網絡出版物,這條路暫時不考慮。電子出版物5000左右的成本,包括生產成本和人力成本,要保證持平的話,恐怕要由作者承擔。這是我向領導報選題時的一項。您作爲作者,據我理解,如果沒有相關經費支持,由您個人承擔是有問題的。所以這個選題的前景還要您考慮。

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

參考書目

1.    []Ted FaisonBorland C++3.1編程指南,蔣維杜等譯,清華大學出版社,1993

2.    侯俊傑,深入淺出MFC,華中科技大學出版社,2001

3.    []Jess Liberty21天學通C++,人民郵電出版社,2002

4.    [] Stanley B.Lippman,深度探索C++對象模型,侯捷譯,華中科技大學出版社,第1 2007  

5.    張海藩等,軟件工程,人民郵電出版社2010

6.    宛延闓,C++語言和麪向對象程序設計,第二版,清華大學出版社1997

7.    網上下載的全國高自考上機考試題目

8.    陳樹振、陳翼男,C++文本文件的一種讀寫方法,《電腦開發與應用》2008年第10期,中國北方自動控制研究所

9.    陳樹振,CC++的圖示教學法,《教學研究》,200510月,北京科技職業學院

10.             [] Peter Van Der Linden C專家編程,徐波 譯,人民郵電出版社,2002,12

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章