• <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  評(píng)論-8  文章-0  trackbacks-0

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

                  Introduces a synonym for some other type. Form:

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

                  typedef type synonym;
                 

                  defines synonym as another name for the type named type.

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

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

            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;
                按照當(dāng)時(shí)的想法,句子 SPREADSHEET[g_nNumRows][g_nNumCols] sh 的意思應(yīng)該是 CELL sh ,不就該是這樣的嗎(因?yàn)樗皇莻€(gè)別名/馬甲)?但在我那個(gè)想法里 sh 可不是數(shù)組,所以我當(dāng)時(shí)無(wú)法理解 sh 后來(lái)的行為。形式主義,對(duì),形式主義影響了我,當(dāng)時(shí)我就一徹底的形式主義者。我還想再一遍地重復(fù)這個(gè)詞,不過(guò)那也太給它面子了。算了, Not worth to fight!(哈,最近看的一部精彩的家庭喜劇中的臺(tái)詞。這部劇名叫《the middle》)。《核》一書中接下來(lái)還有一個(gè)精彩的用法,為了簡(jiǎn)化代碼,我把它寫成這個(gè)樣子:
            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;
                如此一來(lái),g_ss 就有了 Base 的 n 成員和 256 * 1024 個(gè) CELL 結(jié)構(gòu)。當(dāng)向 Derive 對(duì)象使用 [] 時(shí)(它是 SPREADSHEET& 型),它的行為就跟數(shù)組一致了(n 成員不會(huì)索引到,這也是不允許派生類有數(shù)據(jù)成員的原因)。關(guān)于它的內(nèi)存并沒(méi)有在它聲明的時(shí)候開(kāi)辟,以及后來(lái)怎么開(kāi)辟,那就是另一個(gè)冒險(xiǎn)故事了。這種手法讓我再一次為《核》這本書所折服。
                好了,回到 typedef 。我見(jiàn)得最多的用法不外乎 typedef int value_type ,“取綽號(hào)”是他的職責(zé)所在,我不能只把它理解為:當(dāng)你看到 B( value_type ) 時(shí),它只不過(guò)是 A ( int ),還要把它理解為像上面提到的一樣:SPREADSHEET 并不只是一個(gè) CELL ,而是多個(gè) CELL 組成的 Array 的首個(gè)元素的位置指針,不然后面的兩個(gè)跟屁蟲(chóng)雙胞胎 “[][]” 作何解釋。我的這種想法讓我想起了 ATL 中的 OLECHAR ,在那里我也曾是個(gè)形式主義者(又重復(fù)了一遍!)。OLECHAR 在特定的平臺(tái)上有特定的意義,比如在 windows 平臺(tái)并定義了 UNICODE 的情況下,它是 wchar_t 。如果保持這種理解,將無(wú)法把它當(dāng)做一種特別的類型,從而在語(yǔ)言層面上有了障礙,也就違背了 OLECHAR 生來(lái)是為 COM 組件做“特殊”服務(wù)的本意。我們要把它當(dāng)做基本類型看待,至于怎么看待以及詳細(xì)的方法,另一個(gè)冒險(xiǎn)故事…… 所以,“取綽號(hào)”專家的內(nèi)涵并不單薄,我不能一廂情愿的認(rèn)為他只是個(gè)愛(ài)捉弄人的討厭鬼,它正經(jīng)起來(lái)可也是一表人才滴。下面是一些 typedef 的用法(來(lái)自《c++模板元編程》中某習(xí)題的解答):
            class foo {...};
            
            typedef int (foo::*pmd);    // pmd 解釋為:指向 foo 數(shù)據(jù)成員的指針,返回值為 int
            typedef int (foo::*pmf)();  // pmf 解釋為:指向 foo 函數(shù)成員的指針,返回值為 int
            typedef int (*pfunc)();     // pfunc 解釋為:指向函數(shù)的指針,返回值為 int 且無(wú)參數(shù)(有參數(shù)的也就不難想象了)
            typedef const int& refc;    // 不說(shuō)這個(gè)了
                上面的展示非常不全面,網(wǎng)上總結(jié)的東西一大堆,我不能偷懶引用,去看才實(shí)在。不過(guò)有了這些知識(shí),理解其它東西應(yīng)該足夠了。
            posted on 2009-12-09 21:20 崇文 閱讀(507) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久亚洲日韩看片无码| 久久免费大片| 精品久久无码中文字幕| 久久影院综合精品| 欧美精品一区二区精品久久| 国产成人精品久久二区二区| 欧美久久精品一级c片片| 久久久久免费视频| 久久99久久99精品免视看动漫| 久久亚洲国产成人精品性色| 久久AAAA片一区二区| 久久久久人妻一区精品性色av| 久久精品无码一区二区日韩AV| 97久久精品国产精品青草| 久久久无码精品亚洲日韩京东传媒| 国产精品久久久久jk制服| 伊人久久亚洲综合影院| 一本伊大人香蕉久久网手机| 九九精品99久久久香蕉| 久久婷婷色香五月综合激情| 免费精品99久久国产综合精品| 亚洲色婷婷综合久久| 久久婷婷是五月综合色狠狠| 国产三级精品久久| 久久免费精品视频| 精品一区二区久久| 97久久超碰国产精品2021| 久久精品国产亚洲av麻豆小说| 99久久免费国产精品特黄| 污污内射久久一区二区欧美日韩 | 精品免费tv久久久久久久| 久久综合亚洲色HEZYO社区| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久777国产线看观看精品| 久久永久免费人妻精品下载| 久久伊人五月丁香狠狠色| 久久人人爽人人爽人人片av麻烦 | 久久精品国产亚洲7777| 99久久99久久精品国产| 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲精品无码久久久影院相关影片|