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

Chip Studio

常用鏈接

統計

最新評論

現代C++中的預處理宏

現代C++中的預處理宏

--徐東來

摘要: 在C++從C繼承的遺產中,預處理宏是其中的一部分。在現代C++的發展過程中,預處理宏是否還有意義?本文將討論之。

關鍵字: 預處理 宏 #define #pragma

 

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

   典型的一個例子,大家都知道“const int a=100;”就比“#define a 100”要好,因為const提供類型安全、避免了預處理的意外修改等。

   然而,還是有一些理由讓我們去使用#define。

一、使用預處理宏

1)   守護頭文件

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

#ifndef MYPROG_X_H

#define MYPROG_X_H

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

#endif

2)   使用預處理特性

在調試代碼中,插入行號或編譯時間這類信息通常很有用,可以使用預定義的標準宏,例如__FILE__、__LINE__、__DATE__和__TIME__。

3)   編譯時期選擇代碼

A.  調試代碼

選擇性的輸出一些調試信息:

void f()

{

#ifdef _DEBUG

   cerr<<”調試信息”<<endl;

#endif

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

}

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

void f()

{

   if(_DEBUG)

   {

   cerr<<”調試信息”<<endl;

}

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

}

B.  特定平臺代碼

同一函數同一功能在不同的編譯平臺上可能有不同的表現形式,我們可以通過定義宏來區分不同的平臺。

C.  不同的數據表示方式

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

BEGIN_MESSAGE_MAP, END_MESSAGE_MAP的實現。

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

包含winsock2 lib文件:

#pragma comment(lib,ws2_32)

用如下預處理宏,可以使結構按1字結對齊:

#pragma pack(push)

#pragma pack(1)

// 結構定義

#pragma pack(pop)

      禁止掉某些警告信息:

#pragma warning( push )

#pragma warning( disable : 4705 )

#pragma warning( disable : 4706 )

#pragma warning( error : 164 )// 把164號警告作為錯誤報出

// Some code

#pragma warning( pop )

 

二、宏的常見陷阱

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

1)   不要忘記為參數加上括號

// 例1:括號陷阱一:參數

//

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

例如:

max(i += 2, j)

展開后:

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

考慮運算符優先級和語言規則,實際上是:

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

這種錯誤可能需要長時間的調試才可以發現。

2)   不要忘記為整個展開式加上括號

// 例2:括號陷阱二:展開式

//

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

   例如:

   m = max(j, k) + 42;

   展開后為:

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

考慮運算符優先級和語言規則,實際上是:

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

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

3)   當心多參數運算

// 例3:多參數運算

//

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

max(++j, k);

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

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

   類似的:

max(f(), pi)

展開后:

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

如果f()的結果大于等于pi,f()會執行兩次,這絕對缺乏效率,而且可能是錯誤的。

4)   名字沖突

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

// 例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));

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

 

宏的其他缺陷:

5)   宏不能遞歸

   容易理解。

6)   宏沒有地址

你可能得到任何自由函數或成員函數的指針,但不可能得到一個宏的指針,因為宏沒有地址。宏之所以沒有地址,原因很顯然===宏不是代碼,宏不會以自身的形勢存在,因為它是一種被美化了的文本替換規則。

7)   宏有礙調試

在編譯器看到代碼之前,宏就會修改相應的代碼,因而,他會嚴重改變變量名稱和其他名稱;此外,在調試階段,無法跟蹤到宏的內部。



posted on 2008-02-03 17:56 MyChip 閱讀(285) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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热免费精品在线观看| 欧美专区在线观看| 亚洲第一精品电影| 久久久精彩视频| 免费亚洲一区二区| 久久一区二区视频| 久久综合伊人77777蜜臀| 亚洲在线视频免费观看| 一区二区电影免费在线观看| 亚洲区欧美区| 亚洲精品亚洲人成人网| 亚洲免费播放| 亚洲午夜精品久久久久久浪潮| 欧美激情第8页| 欧美1级日本1级| 亚洲黄色在线| 亚洲一区二区三区高清 | 欧美怡红院视频| 欧美一区二区三区久久精品| 亚洲专区免费| 久久久国产精品一区二区三区| 欧美一区二区在线| 美玉足脚交一区二区三区图片| 国产日韩欧美三区| 欧美激情精品久久久| 亚洲综合三区| 亚洲第一伊人| 国产精品一区毛片| 欧美成年人网站| 亚洲欧美日韩综合aⅴ视频| 亚洲精品一区二区三区蜜桃久| 欧美mv日韩mv国产网站| 亚洲日本中文字幕区| 久久精品成人欧美大片古装| 在线视频中文亚洲| 欧美与黑人午夜性猛交久久久| 亚洲精品一区二区在线| 久久国产一区二区| 亚洲欧美经典视频| 久久全国免费视频| 国产精品久久久久久久久久免费看| 欧美激情综合在线| 亚洲精品国产拍免费91在线| 欧美一区二区三区另类| 一级日韩一区在线观看| 欧美日韩亚洲高清| 一本色道久久综合亚洲91| 美脚丝袜一区二区三区在线观看| 久久久亚洲人| 亚洲影院在线观看| 国产农村妇女毛片精品久久莱园子| 中国日韩欧美久久久久久久久| 美女999久久久精品视频| 亚洲国产另类 国产精品国产免费| 国产精品99久久不卡二区| 欧美肉体xxxx裸体137大胆| 亚洲综合激情| 欧美一级一区| 在线成人小视频| 亚洲人成网站精品片在线观看| 欧美在线观看你懂的| 伊人精品成人久久综合软件| 欧美日韩成人| 亚洲在线视频一区| 欧美成人免费网| 亚洲欧美电影在线观看| 亚洲黄色av| 午夜激情一区| 日韩亚洲综合在线| 久久精品亚洲国产奇米99| 91久久精品国产91久久| 亚洲一区三区视频在线观看| 亚洲国产三级在线| 欧美一区二区三区视频免费| 亚洲伦理久久| 久久久亚洲成人| 亚洲在线播放| 国产精品h在线观看| 裸体女人亚洲精品一区| 亚洲欧美日本国产有色| 中文亚洲字幕| 一区二区三区 在线观看视频| 亚洲国产一区二区三区高清| 欧美在线啊v一区| 久久久久国产精品人| 一本久道久久综合中文字幕| 亚洲成色777777女色窝| 精品福利av| 91久久久久久久久| 国产欧美在线观看| 久久久久久婷| 亚洲欧洲日本国产| 欧美在线观看视频一区二区三区 | 亚洲第一精品夜夜躁人人爽| 亚洲精品综合久久中文字幕| 毛片精品免费在线观看| 一本久久a久久免费精品不卡| 久久久久国色av免费看影院| 欧美高清视频www夜色资源网| 欧美一区二区大片| 六十路精品视频| 在线亚洲一区观看| 欧美精品一区二区在线观看| 欧美在线免费观看视频| 亚洲一区二区欧美日韩| 亚洲欧洲精品一区二区精品久久久| 午夜一级在线看亚洲| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲日本一区二区| 亚洲视频成人| 揄拍成人国产精品视频| 欧美日韩性视频在线| 亚洲欧美日韩精品| 亚洲影视九九影院在线观看| 久久精品91| 亚洲国产精品美女| 亚洲免费在线视频| 亚洲国产欧美日韩精品| 欧美亚洲一区二区在线| 国产精品激情| 国产乱码精品一区二区三区忘忧草 | 欧美成人高清视频| 亚洲欧美日韩人成在线播放| 亚洲精品永久免费精品| 欧美+日本+国产+在线a∨观看| 久久久久国产一区二区三区四区| 亚洲欧洲久久| 欧美激情精品久久久久久蜜臀| 国产一区二区三区在线观看网站| 亚洲一级在线| 亚洲欧美日韩国产成人精品影院 | 欧美色视频日本高清在线观看| 极品尤物久久久av免费看| 久久国产99| 欧美激情一区二区久久久| 亚洲国产精品久久精品怡红院| 亚洲第一福利视频| 亚洲片在线资源| 亚洲桃色在线一区| 久久电影一区| 欧美老女人xx| 国产一区二区三区精品欧美日韩一区二区三区 | 精品动漫3d一区二区三区| 亚洲久久在线| 久久精品国产综合| 亚洲人线精品午夜| 久久久一区二区三区| 欧美精品乱码久久久久久按摩| 国产精品亚洲一区| 制服丝袜激情欧洲亚洲| 麻豆国产精品一区二区三区| 亚洲午夜日本在线观看| 六月婷婷一区| 亚洲精品美女| 狠狠狠色丁香婷婷综合久久五月| 在线亚洲激情| 久久精品亚洲一区| 亚洲午夜精品福利| 亚洲乱码国产乱码精品精98午夜| 老鸭窝毛片一区二区三区| 亚洲精品国产日韩| 女女同性女同一区二区三区91| 国内在线观看一区二区三区| 午夜精品久久久久久99热| 欧美在线观看网站| 国产视频亚洲精品| 久久久久久久久一区二区| 亚洲片区在线| 嫩草影视亚洲| 国产一区二区三区四区三区四| 午夜一级久久| 日韩视频专区| 欧美一区二区日韩| 欧美一区二区日韩一区二区| 欧美高清一区| 国际精品欧美精品| 亚洲淫片在线视频| 99精品国产一区二区青青牛奶| 欧美日韩午夜在线| 久久久7777| 欧美国产日本高清在线| 亚洲一区二区三区四区中文| 亚洲深夜福利视频| 麻豆久久精品| 久久亚洲综合色| 日韩写真在线| 一本色道久久综合狠狠躁篇怎么玩 | 午夜精品区一区二区三| 久久久久久网址| 午夜性色一区二区三区免费视频 | 伊人久久亚洲影院| 欧美日韩视频在线第一区| 免费不卡中文字幕视频| 亚洲欧洲精品一区二区三区不卡 | 亚洲欧洲精品一区二区三区不卡| 亚洲美女少妇无套啪啪呻吟| 一区二区免费看| 久久九九免费视频|