• <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>

            twzheng's cppblog

            『站在風(fēng)口浪尖緊握住鼠標(biāo)旋轉(zhuǎn)!』 http://www.cnblogs.com/twzheng

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              136 隨筆 :: 78 文章 :: 353 評(píng)論 :: 0 Trackbacks

            首先我們來(lái)看看下面這個(gè)例子:
            typedef int * int_ptr;
            #define INT_PTR int *
            const int_ptr p; //p不可更改,但p指向的內(nèi)容可更改
            const INT_PTR p; //p可更改,但是p指向的內(nèi)容不可更改
            int_ptr是一種類(lèi)型(類(lèi)型本身就是整型指針),const int_ptr p就是把指針給鎖住了p不可更改,而const INT_PTR p是const int * p鎖的是指針p所指的對(duì)象。這些使用常常使我迷惑,所以搜集整理對(duì)他們的理解如下:

            #define的用法:

            1、簡(jiǎn)單的宏定義
            #define MAXTIME 1000
            一個(gè)簡(jiǎn)單的MAXTIME就定義好了,它代表1000,如果在程序里面寫(xiě):
            if(i<MAXTIME){}
            編譯器在處理這個(gè)代碼之前會(huì)對(duì)MAXTIME進(jìn)行處理替換為1000。
            這樣的定義看起來(lái)類(lèi)似于普通的常量定義const,但也有著不同,因?yàn)閐efine的定義只是簡(jiǎn)單的替換,而不是作為一個(gè)量來(lái)使用,這個(gè)問(wèn)題在下面反映的尤為突出。

            2、帶參數(shù)的宏
            define可以像函數(shù)那樣接受一些參數(shù),如下:
            #define max(x,y) (x)>(y)?(x):(y);
            它將返回兩個(gè)數(shù)中較大的那個(gè),這個(gè)“函數(shù)”沒(méi)有類(lèi)型檢查,就好像一個(gè)函數(shù)模板似的,當(dāng)然,不難看出它絕對(duì)沒(méi)有模板那么安全。
            因?yàn)檫@樣做的話(huà)存在隱患,例子如下:
            #define Add(a,b) a+b;
            一般的單獨(dú)使用是沒(méi)有問(wèn)題的,但是如果遇到如:c * Add(a,b) * d的時(shí)候就會(huì)出現(xiàn)問(wèn)題,代數(shù)式的本意是a+b然后和c,d相乘,但是因?yàn)槭褂昧薲efine(它只是一個(gè)簡(jiǎn)單的替換),所以式子實(shí)際上變成了c*a + b*d 。
            再看看這個(gè)例子:
            #define int_ptr int *;
            int_ptr a,b;
            本意是a和b都是int型指針,但是實(shí)際上變成
            int* a,b;
            a是int型指針,而b是int型變量。這時(shí)應(yīng)該使用typedef定義:
            typedef int* int_ptr;
            int_ptr a,b;
            這樣a和b就都是int型指針了。

            3、define的多行定義
            define可以替代多行的代碼,例如MFC中的宏定義(非常的經(jīng)典,雖然讓人看了惡心)
            #define MACRO(arg1, arg2) do { \
            /* declarations */ \
            stmt1; \
            stmt2; \
            /*  */ \
            while(0/* (no trailing ; ) */
            關(guān)鍵是要在每一個(gè)換行的時(shí)候加上一個(gè)"\"。

            4、在大規(guī)模的開(kāi)發(fā)過(guò)程中,特別是跨平臺(tái)和系統(tǒng)的軟件里,define最重要的功能是條件編譯。
            #ifdef WINDOWS


            #endif
            #ifdef LINUX


            #endif
            可以在編譯的時(shí)候通過(guò)#define設(shè)置編譯環(huán)境

            5、如何定義宏、取消宏
            //定義宏
            #define [MacroName] [MacroValue]
            //取消宏
            #undef [MacroName]
            //普通宏
            #define PI (3.1415926)
            //帶參數(shù)的宏
            #define max(a,b) ((a)>(b)? (a),(b))
            關(guān)鍵是十分容易產(chǎn)生錯(cuò)誤,包括機(jī)器和人理解上的差異等等。

            6、條件編譯
            #ifdef XXX…(#else) …#endif
            例如:
            #ifdef DV22_AUX_INPUT
            #define AUX_MODE 3
            #else
            #define AUY_MODE 3
            #endif


            define和typedef的區(qū)別:

            1、 #define是預(yù)處理指令,在編譯預(yù)處理時(shí)進(jìn)行簡(jiǎn)單的替換,不作正確性檢查,不管含義是否正確照樣帶入,只有在編譯已被展開(kāi)的源程序時(shí)才會(huì)發(fā)現(xiàn)可能的錯(cuò)誤并報(bào)錯(cuò)。例如:
            #define PI 3.1415926
            程序中的:area=PI*r*r 會(huì)替換為3.1415926*r*r
            如果你把#define語(yǔ)句中的數(shù)字9 寫(xiě)成字母g 預(yù)處理也照樣帶入。

            2、typedef是在編譯時(shí)處理的。它在自己的作用域內(nèi)給一個(gè)已經(jīng)存在的類(lèi)型一個(gè)別名,但是You cannot use the typedef specifier inside a function definition。

            3、 
            typedef int * int_ptr;

            #define int_ptr int *
            作用都是用int_ptr代表 int * ,但是二者不同,正如前面所說(shuō),#define在預(yù)處理時(shí)只是進(jìn)行簡(jiǎn)單的替換,而typedef不是簡(jiǎn)單替換 ,而是采用如同定義變量的方法那樣來(lái)聲明一種類(lèi)型。重復(fù)前面的例子:
            #define int_ptr int *
            int_ptr a,b; 
            //相當(dāng)于int * a, b; 只是簡(jiǎn)單的宏替換,a是整型指針,而b之是整型變量
            typedef int * int_ptr;
            int_ptr a,b; 
            //a, b 都為指向int的指針,typedef為int* 引入了一個(gè)新的助記符

            4、也許您已經(jīng)注意到#define不是語(yǔ)句,不要在行末加分號(hào),否則會(huì)連分號(hào)一塊置換;但是typedef結(jié)束必須加分號(hào),因?yàn)樗钦Z(yǔ)句。


            posted on 2007-04-17 02:30 譚文政 閱讀(1556) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): 基礎(chǔ)知識(shí)

            評(píng)論

            # re: 理解#define和typedef 2007-04-22 15:43 heweitykc
            兄弟,長(zhǎng)大的嗎?校友!  回復(fù)  更多評(píng)論
              

            # re: 理解#define和typedef 2007-04-23 02:37 苦味酸
            @heweitykc
            兄弟,你怎么曉得我是長(zhǎng)江大學(xué)的呢,你是長(zhǎng)大哪一屆的?我是長(zhǎng)大東校區(qū)計(jì)算機(jī)專(zhuān)業(yè)的,今年畢業(yè)  回復(fù)  更多評(píng)論
              

            久久精品国产一区二区三区不卡| 狠狠久久亚洲欧美专区| 久久久久夜夜夜精品国产| av无码久久久久不卡免费网站 | 国内精品伊人久久久久影院对白| 久久精品9988| 国产精品久久久久久久久久影院| 国产A三级久久精品| 久久精品国产亚洲一区二区| 国产精品日韩深夜福利久久 | 精品一区二区久久| 久久久中文字幕日本| 日韩精品久久无码中文字幕| 亚洲国产精品久久久久婷婷软件| 久久精品夜色噜噜亚洲A∨| 少妇内射兰兰久久| 老司机午夜网站国内精品久久久久久久久 | 一本色道久久99一综合| 91精品国产高清久久久久久91| 亚洲国产精品无码久久青草| 久久人妻少妇嫩草AV无码专区| 久久精品国产清自在天天线| 亚洲AV无码一区东京热久久| 99久久国产综合精品成人影院| 欧美日韩久久中文字幕| 久久se精品一区精品二区国产 | 亚洲伊人久久成综合人影院 | 狠狠人妻久久久久久综合| 久久久噜噜噜www成人网| 人妻无码αv中文字幕久久琪琪布 人妻无码精品久久亚瑟影视 | 九九精品久久久久久噜噜| 办公室久久精品| 久久综合久久久| 国产精品一区二区久久不卡 | 精品国产综合区久久久久久| 午夜久久久久久禁播电影| 99久久做夜夜爱天天做精品| 精品乱码久久久久久夜夜嗨| 久久青青草原精品影院| 国内精品久久久久| 久久se精品一区二区|