• <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是一種類型(類型本身就是整型指針),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)類似于普通的常量定義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)有類型檢查,就好像一個(gè)函數(shù)模板似的,當(dāng)然,不難看出它絕對(duì)沒(méi)有模板那么安全。
            因?yàn)檫@樣做的話存在隱患,例子如下:
            #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)存在的類型一個(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)聲明一種類型。重復(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 譚文政 閱讀(1549) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 基礎(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ī)專業(yè)的,今年畢業(yè)  回復(fù)  更多評(píng)論
              

            国产精品久久久久天天影视| 国产精品18久久久久久vr| 国产精品一久久香蕉国产线看观看| 无码人妻少妇久久中文字幕 | 无遮挡粉嫩小泬久久久久久久| 久久精品无码一区二区日韩AV| 精品久久久久久国产91| 99久久精品国内| 久久精品国产福利国产秒| 99国产欧美久久久精品蜜芽| 77777亚洲午夜久久多喷| 欧美大香线蕉线伊人久久| 无遮挡粉嫩小泬久久久久久久| 中文字幕久久精品无码| 伊人久久大香线蕉亚洲| 亚洲日韩中文无码久久| 亚洲精品白浆高清久久久久久| 无码人妻久久一区二区三区免费丨| av色综合久久天堂av色综合在| 亚洲人成网亚洲欧洲无码久久 | 狠狠人妻久久久久久综合蜜桃| 国产高潮国产高潮久久久91 | 成人a毛片久久免费播放| 国产亚洲精午夜久久久久久| 国产精品永久久久久久久久久| 久久国产视频99电影| 天天做夜夜做久久做狠狠| 99精品国产99久久久久久97 | 狠狠色噜噜狠狠狠狠狠色综合久久| 久久青草国产手机看片福利盒子| 99久久精品久久久久久清纯| 久久久久婷婷| 久久AV高潮AV无码AV| 久久99中文字幕久久| 欧美伊人久久大香线蕉综合69| 亚洲精品国产第一综合99久久| 青青草原精品99久久精品66| 久久青青草原国产精品免费| 2021久久精品免费观看| 久久se精品一区精品二区| 伊人色综合九久久天天蜜桃|