青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

      twzheng's cppblog

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

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

      現(xiàn)代C++中的預(yù)處理宏

      --徐東來

      摘要:C++從C繼承的遺產(chǎn)中,預(yù)處理宏是其中的一部分。在現(xiàn)代C++的發(fā)展過程中,預(yù)處理宏是否還有意義?本文將討論之。

      關(guān)鍵字:預(yù)處理 宏 #define #pragma

       

         C++中有那么多靈活的特性,例如重載、類型安全的模板、const關(guān)鍵字等等,為什么程序員還要寫“#define”這樣的預(yù)處理指令?

         典型的一個(gè)例子,大家都知道“const int a=100;”就比“#define a 100”要好,因?yàn)閏onst提供類型安全、避免了預(yù)處理的意外修改等。

         然而,還是有一些理由讓我們?nèi)ナ褂?define。

      一、使用預(yù)處理宏

      1)   守護(hù)頭文件

      為了防止頭文件被多次包含,這是一種常用技巧。

      #ifndef MYPROG_X_H

      #define MYPROG_X_H

      // … 頭文件x.h的其余部分

      #endif

      2)   使用預(yù)處理特性

      在調(diào)試代碼中,插入行號(hào)或編譯時(shí)間這類信息通常很有用,可以使用預(yù)定義的標(biāo)準(zhǔn)宏,例如__FILE__、__LINE__、__DATE__和__TIME__。

      3)   編譯時(shí)期選擇代碼

      A. 調(diào)試代碼

      選擇性的輸出一些調(diào)試信息:

      void f()

      {

      #ifdef _DEBUG

         cerr<<”調(diào)試信息”<<endl;

      #endif

      // .. f()的其他部分

      }

      通常我們也可以用條件判斷來代替:

      void f()

      {

         if(_DEBUG)

         {

         cerr<<”調(diào)試信息”<<endl;

      }

      // .. f()的其他部分

      }

      B. 特定平臺(tái)代碼

      同一函數(shù)同一功能在不同的編譯平臺(tái)上可能有不同的表現(xiàn)形式,我們可以通過定義宏來區(qū)分不同的平臺(tái)。

      C. 不同的數(shù)據(jù)表示方式

      <<深入淺出MFC>>這本書對(duì)MFC框架中宏的使用解析的很透徹,也讓我們領(lǐng)略到宏的強(qiáng)大功能。可以參看DECLARE_MESSAGE_MAP(),

      BEGIN_MESSAGE_MAP, END_MESSAGE_MAP的實(shí)現(xiàn)。

      4)   #pragma的使用,例如用#pragma禁止掉無傷大雅的警告,用于可移植性的條件編譯中。例如,

      包含winsock2 lib文件:

      #pragma comment(lib,ws2_32)

      用如下預(yù)處理宏,可以使結(jié)構(gòu)按1字結(jié)對(duì)齊:

      #pragma pack(push)

      #pragma pack(1)

      // 結(jié)構(gòu)定義

      #pragma pack(pop)

           禁止掉某些警告信息:

      #pragma warning( push )

      #pragma warning( disable : 4705 )

      #pragma warning( disable : 4706 )

      #pragma warning( error : 164 )// 把164號(hào)警告作為錯(cuò)誤報(bào)出

      // Some code

      #pragma warning( pop )

       

      二、宏的常見陷阱

         下面示范如何寫一個(gè)簡單的預(yù)處理宏max();這個(gè)宏有兩個(gè)參數(shù),比較并返回其中較大的一個(gè)值。在寫這樣一個(gè)宏時(shí),容易犯哪些錯(cuò)誤?有四大易犯錯(cuò)誤。

      1)   不要忘記為參數(shù)加上括號(hào)

      // 例1:括號(hào)陷阱一:參數(shù)

      //

      #define max(a, b) a < b ? b : a

      例如:

      max(i += 2, j)

      展開后:

      i += 2 < j ? j : i += 2

      考慮運(yùn)算符優(yōu)先級(jí)和語言規(guī)則,實(shí)際上是:

      i += ((2 < j) ? j : i += 2)

      這種錯(cuò)誤可能需要長時(shí)間的調(diào)試才可以發(fā)現(xiàn)。

      2)   不要忘記為整個(gè)展開式加上括號(hào)

      // 例2:括號(hào)陷阱二:展開式

      //

      #define max(a, b) (a) < (b) ? (b) : (a)

         例如:

         m = max(j, k) + 42;

         展開后為:

         m = (j) < (k) ? (j) : (k) + 42;

      考慮運(yùn)算符優(yōu)先級(jí)和語言規(guī)則,實(shí)際上是:

         m = ((j) < (k)) ? (j) : ((k) + 42);

         如果j >= k, m被賦值k+42,正確;如果j < k, m被賦值j,是錯(cuò)誤的。如果給展開式加上括號(hào),就解決了這個(gè)問題。

      3)   當(dāng)心多參數(shù)運(yùn)算

      // 例3:多參數(shù)運(yùn)算

      //

      #define max(a, b) ((a) < (b) ? (b) : (a))

      max(++j, k);

         如果++j的結(jié)果大于k,j會(huì)遞增兩次,這可能不是程序員想要的:

      ((++j) < (k) ? (k) : (++j))

         類似的:

      max(f(), pi)

      展開后:

      ((f()) < (pi) ? (pi) : (f()))

      如果f()的結(jié)果大于等于pi,f()會(huì)執(zhí)行兩次,這絕對(duì)缺乏效率,而且可能是錯(cuò)誤的。

      4)   名字沖突

      宏只是執(zhí)行文本替換,而不管文本在哪兒,這意味著只要使用宏,就要小心對(duì)這些宏命名。具體來說,這個(gè)max宏最大的問題是,極有可能會(huì)和標(biāo)準(zhǔn)的max()函數(shù)模板沖突:

      // 例4:名字沖突

      //

      #define max(a,b) ((a) < (b) ? (b) : (a))

      #include <algorithm> // 沖突!

      <algorithm>中,有如下:

      template<typename T> const T&

      max(const T& a, const T& b);

      宏將它替換為如下,將無法編譯:

      template<typename T> const T&

      ((const T& a) < (const T& b) ? (const T& b) : (const T& a));

      所以,我們盡量避免命名的沖突,想出一個(gè)不平常的,難以拼寫的名字,這樣才能最大可能地避免與其他名字空間沖突。

       

      宏的其他缺陷:

      5)   宏不能遞歸

         容易理解。

      6)   宏沒有地址

      你可能得到任何自由函數(shù)或成員函數(shù)的指針,但不可能得到一個(gè)宏的指針,因?yàn)楹隂]有地址。宏之所以沒有地址,原因很顯然===宏不是代碼,宏不會(huì)以自身的形勢(shì)存在,因?yàn)樗且环N被美化了的文本替換規(guī)則。

      7)   宏有礙調(diào)試

      在編譯器看到代碼之前,宏就會(huì)修改相應(yīng)的代碼,因而,他會(huì)嚴(yán)重改變變量名稱和其他名稱;此外,在調(diào)試階段,無法跟蹤到宏的內(nèi)部。

      posted on 2007-04-23 23:19 譚文政 閱讀(679) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C/C++
      青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
    1. <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>
              99在线观看免费视频精品观看| 亚洲素人一区二区| 欧美日韩久久| 欧美极品在线播放| 欧美日韩精品一区二区天天拍小说 | 久久经典综合| 老司机aⅴ在线精品导航| 美腿丝袜亚洲色图| 亚洲欧洲一区二区三区在线观看| 欧美岛国激情| 亚洲剧情一区二区| 香蕉精品999视频一区二区 | 久久久亚洲综合| 久久久福利视频| 欧美成年人视频网站| 欧美日韩中文字幕在线视频| 国产美女精品在线| 亚洲国产成人久久综合| 国产精品99久久久久久久久久久久 | 欧美a级片一区| 亚洲精品一区二| 欧美一区视频| 欧美日本国产| 精品成人国产在线观看男人呻吟| 日韩午夜一区| 久久一区中文字幕| 一本色道久久综合亚洲二区三区 | 麻豆乱码国产一区二区三区| 亚洲精品美女91| 久久精品国产99国产精品澳门| 欧美国产视频一区二区| 国产亚洲福利社区一区| 一区二区三区导航| 欧美成人四级电影| 亚洲欧美日韩国产成人精品影院| 免费观看成人鲁鲁鲁鲁鲁视频| 国产精品普通话对白| 亚洲人成高清| 久久综合色婷婷| 欧美精品亚洲一区二区在线播放| 久久久久久久久久久久久久一区| 欧美日韩午夜剧场| 亚洲人成网站在线播| 久久久噜噜噜久久中文字幕色伊伊| 91久久国产综合久久| 久久综合电影| 娇妻被交换粗又大又硬视频欧美| 欧美一区亚洲一区| 亚洲校园激情| 国产精品免费观看在线| 亚洲视频免费在线观看| 亚洲国产一区二区三区高清| 久久久高清一区二区三区| 国产视频一区二区三区在线观看| 亚洲一品av免费观看| 一区二区不卡在线视频 午夜欧美不卡在 | 免费不卡中文字幕视频| 韩国av一区二区| 久久精品国产亚洲a| 亚洲男人的天堂在线| 国产精品综合| 久久岛国电影| 欧美亚洲在线播放| 国产小视频国产精品| 久久久久九九视频| 久久精品国产精品亚洲综合| 国产区在线观看成人精品| 欧美在线3区| 性欧美超级视频| 国产在线拍偷自揄拍精品| 久久久之久亚州精品露出| 久久久精品久久久久| 亚洲国产婷婷香蕉久久久久久| 欧美成人精品| 欧美精品尤物在线| 亚洲一区二区三区在线| 亚洲欧美日韩精品在线| 狠狠爱www人成狠狠爱综合网| 你懂的视频一区二区| 欧美日韩1区| 欧美一区二区精品在线| 久久精品一区中文字幕| 亚洲日本欧美| 中文日韩在线视频| 国产综合色一区二区三区| 欧美激情久久久久久| 欧美日韩在线视频一区二区| 欧美中文在线视频| 久久综合综合久久综合| 亚洲色图综合久久| 欧美一区二区三区在线观看视频| 亚洲精选视频免费看| 欧美四级在线观看| 亚洲综合成人在线| 久久成人免费网| 亚洲免费不卡| 久久gogo国模啪啪人体图| 日韩视频在线免费| 午夜日韩视频| 一区二区三区欧美在线观看| 欧美专区一区二区三区| 亚洲视频一起| 久久免费国产精品| 亚洲欧美乱综合| 欧美高清日韩| 久久亚洲一区二区三区四区| 欧美黑人在线播放| 久久久欧美精品| 欧美三区在线观看| 嫩草影视亚洲| 国模精品娜娜一二三区| 一区二区成人精品| 亚洲精品久久在线| 久久久久久久97| 欧美在线视频a| 欧美性片在线观看| 亚洲二区免费| 亚洲第一区在线| 久久大逼视频| 欧美一区二区女人| 国产精品久久久久av| 亚洲欧洲精品一区二区三区不卡| 国模精品娜娜一二三区| 亚洲自拍电影| 亚洲欧美一区二区三区极速播放 | 久久综合给合| 久久婷婷综合激情| 国产亚洲aⅴaaaaaa毛片| 国产精品99久久久久久有的能看| 亚洲日本va午夜在线电影| 久久午夜av| 免费不卡在线视频| 在线成人激情视频| 久久久之久亚州精品露出| 久久精品99国产精品酒店日本| 国产精品嫩草99a| 亚洲欧美国产高清va在线播| 亚洲欧美日韩在线不卡| 国产精品久久久久aaaa九色| 正在播放亚洲一区| 亚洲天堂免费在线观看视频| 欧美日韩亚洲三区| 在线视频一区观看| 欧美一区二视频| 国内精品久久久久影院优| 久久av一区二区三区| 久久综合亚州| 最新国产精品拍自在线播放| 欧美福利视频网站| 99精品免费视频| 亚洲欧美日韩国产一区二区三区 | 久久综合狠狠综合久久激情| 欧美~级网站不卡| 麻豆av一区二区三区久久| 亚洲香蕉视频| 国产精品一二三视频| 欧美一区二区视频97| 老司机午夜精品视频在线观看| 亚洲高清视频的网址| 欧美激情视频网站| 亚洲午夜电影在线观看| 欧美一级片一区| 激情综合电影网| 欧美好吊妞视频| 亚洲欧美日韩国产综合在线| 欧美成人自拍| 亚洲欧美日韩精品| 在线观看日产精品| 欧美日韩和欧美的一区二区| 亚洲欧美国产视频| 欧美国产日韩一区| 亚洲中字在线| 亚洲国产毛片完整版| 欧美午夜精品一区| 久久国产精品高清| 99精品久久| 欧美成人情趣视频| 亚洲你懂的在线视频| 亚洲高清免费在线| 国产免费观看久久| 欧美精品二区| 久久中文精品| 欧美一区二区高清| 日韩午夜激情av| 麻豆成人在线观看| 欧美一区二区高清| 在线一区二区视频| 亚洲国产高清一区二区三区| 国产精品国产一区二区| 女同一区二区| 久久精品国产91精品亚洲| 亚洲一级二级| 亚洲清纯自拍| 欧美大片免费久久精品三p| 欧美一区二区三区视频在线| 在线亚洲高清视频| 亚洲另类一区二区| 亚洲国产成人在线| 在线日韩一区二区| 狠狠久久综合婷婷不卡|