• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-14  評論-8  文章-0  trackbacks-0

                  記得在看《windows 核心編程》第二十五章的 Spreadsheet 示例程序時,我對其中 typedef 的用法很是困惑。當時翻看了《Big c++》(我的第一本 c++ 書籍),很可惜,上面講得很簡單,不足以解答我的疑惑。不知為什么當時沒有堅持去解決那個問題,一直到現在才想起來對 typedef 做個全面的回顧。STL 和 BOOST 為我們呈現了眾多精彩的應用,typedef 功不可沒。先看看 《c++ primer》 怎么說的:

                  Introduces a synonym for some other type. Form:

                  為某種類型引入同義詞。格式:

                  typedef type synonym;
                 

                  defines synonym as another name for the type named type.

                  定義 synonym 為名為 type 的類型的另一名字。

                  在看《核》一書的時候,我的了解就這么一點。為什么我看不懂呢?看看《核》中的用法:

            const int g_nNumRows = 256;
            const int g_nNumCols = 1024;
            
            typedef struct {
                DWORD dwValue;
                BYTE  bDummy[1020];
            } CELL, *PCELL;
            
            typedef CELL SPREADSHEET[g_nNumRows][g_nNumCols];
            typedef SPREADSHEET *PSPREADSHEET;
                按照當時的想法,句子 SPREADSHEET[g_nNumRows][g_nNumCols] sh 的意思應該是 CELL sh ,不就該是這樣的嗎(因為它只是個別名/馬甲)?但在我那個想法里 sh 可不是數組,所以我當時無法理解 sh 后來的行為。形式主義,對,形式主義影響了我,當時我就一徹底的形式主義者。我還想再一遍地重復這個詞,不過那也太給它面子了。算了, Not worth to fight!(哈,最近看的一部精彩的家庭喜劇中的臺詞。這部劇名叫《the middle》)。《核》一書中接下來還有一個精彩的用法,為了簡化代碼,我把它寫成這個樣子:
            class Base {
            public:
                virtual ~Base();
                void fn();
                ...
            private:
                int n;
            };
            
            class Derive : public Base {
                ...
                //no data member allow, just function here.
            };
            static Derive g_ssObject;
            SPREADSHEET& g_ss = *(PSPREADSHEET)(PCELL)g_ssObject;
                如此一來,g_ss 就有了 Base 的 n 成員和 256 * 1024 個 CELL 結構。當向 Derive 對象使用 [] 時(它是 SPREADSHEET& 型),它的行為就跟數組一致了(n 成員不會索引到,這也是不允許派生類有數據成員的原因)。關于它的內存并沒有在它聲明的時候開辟,以及后來怎么開辟,那就是另一個冒險故事了。這種手法讓我再一次為《核》這本書所折服。
                好了,回到 typedef 。我見得最多的用法不外乎 typedef int value_type ,“取綽號”是他的職責所在,我不能只把它理解為:當你看到 B( value_type ) 時,它只不過是 A ( int ),還要把它理解為像上面提到的一樣:SPREADSHEET 并不只是一個 CELL ,而是多個 CELL 組成的 Array 的首個元素的位置指針,不然后面的兩個跟屁蟲雙胞胎 “[][]” 作何解釋。我的這種想法讓我想起了 ATL 中的 OLECHAR ,在那里我也曾是個形式主義者(又重復了一遍!)。OLECHAR 在特定的平臺上有特定的意義,比如在 windows 平臺并定義了 UNICODE 的情況下,它是 wchar_t 。如果保持這種理解,將無法把它當做一種特別的類型,從而在語言層面上有了障礙,也就違背了 OLECHAR 生來是為 COM 組件做“特殊”服務的本意。我們要把它當做基本類型看待,至于怎么看待以及詳細的方法,另一個冒險故事…… 所以,“取綽號”專家的內涵并不單薄,我不能一廂情愿的認為他只是個愛捉弄人的討厭鬼,它正經起來可也是一表人才滴。下面是一些 typedef 的用法(來自《c++模板元編程》中某習題的解答):
            class foo {...};
            
            typedef int (foo::*pmd);    // pmd 解釋為:指向 foo 數據成員的指針,返回值為 int
            typedef int (foo::*pmf)();  // pmf 解釋為:指向 foo 函數成員的指針,返回值為 int
            typedef int (*pfunc)();     // pfunc 解釋為:指向函數的指針,返回值為 int 且無參數(有參數的也就不難想象了)
            typedef const int& refc;    // 不說這個了
                上面的展示非常不全面,網上總結的東西一大堆,我不能偷懶引用,去看才實在。不過有了這些知識,理解其它東西應該足夠了。
            posted on 2009-12-09 21:20 崇文 閱讀(507) 評論(0)  編輯 收藏 引用
            97精品伊人久久久大香线蕉| 久久久免费观成人影院 | 久久久高清免费视频| 亚洲AⅤ优女AV综合久久久| 狠狠色丁香久久婷婷综合图片| 香蕉久久av一区二区三区| 亚洲国产成人久久综合一| 四虎影视久久久免费| 日产精品久久久一区二区| 久久精品国产精品亚洲精品| 久久国产高清一区二区三区| 青青草原精品99久久精品66| 精品国产热久久久福利| 亚洲AV无码久久精品成人| 久久996热精品xxxx| 久久免费的精品国产V∧| 人妻中文久久久久| 66精品综合久久久久久久| 无码精品久久久天天影视| 久久天天躁狠狠躁夜夜不卡| 2021久久国自产拍精品| 久久久久久久久久久久久久| 久久精品?ⅴ无码中文字幕| 97久久天天综合色天天综合色hd| 亚洲精品第一综合99久久| 久久99精品久久久久久不卡| 国产亚洲美女精品久久久久狼| 亚洲欧美伊人久久综合一区二区| 久久精品无码一区二区日韩AV| 欧美伊香蕉久久综合类网站| 国产精品久久久亚洲| 无码伊人66久久大杳蕉网站谷歌| 久久99热这里只频精品6| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久天天躁狠狠躁夜夜avapp| 国产69精品久久久久99| 国产精品无码久久综合| 久久人人爽人人爽人人片av高请| 亚洲伊人久久成综合人影院| 亚洲国产日韩欧美综合久久| 久久天天躁狠狠躁夜夜躁2014|