国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > C > 正文

C語言編程技巧 關于const和#define的區別心得

2020-01-26 16:21:57
字體:
來源:轉載
供稿:網友

#define ASPECT_RATIO 1.653

編譯器會永遠也看不到ASPECT_RATIO這個符號名,因為在源碼進入編譯器之前,它會被預處理程序去掉,于是ASPECT_RATIO不會加入到符號列表中。如果涉及到這個常量的代碼在編譯時報錯,就會很令人費解,因為報錯信息指的是1.653,而不是ASPECT_RATIO。如果ASPECT_RATIO不是在你自己寫的頭文件中定義的,你就會奇怪1.653是從哪里來的,甚至會花時間跟蹤下去。這個問題也會出現在符號調試器中,因為同樣地,你所寫的符號名不會出現在符號列表中。
解決這個問題的方案很簡單:不用預處理宏,定義一個常量: 

const double ASPECT_RATIO = 1.653;


這種方法很有效。但有兩個特殊情況要注意。

首先,定義指針常量時會有點不同。因為常量定義一般是放在頭文件中(許多源文件會包含它),除了指針所指的類型要定義成const外,重要的是指針也經常要定義成const。例如,要在頭文件中定義一個基于char*的字符串常量,你要寫兩次const:


const char * const authorName = "Scott Meyers";

關于const的含義和用法,特別是和指針相關聯的問題,參見條款21。 

另外,定義某個類(class)的常量一般也很方便,只有一點點不同。要把常量限制在類中,首先要使它成為類的成員;為了保證常量最多只有一份拷貝,還要把它定義為靜態成員:      

class GamePlayer {
private:
static const int NUM_TURNS = 5; // constant eclaration 
int scores[NUM_TURNS]; // use of constant
...
};


還有一點,正如你看到的,上面的語句是NUM_TURNS的聲明,而不是定義,所以你還必須在類的實現代碼文件中定義類的靜態成員:


const int GamePlayer::NUM_TURNS; // mandatory definition;
// goes in class impl.file


你不必過于擔心這種小事。如果你忘了定義,鏈接器會提醒你。


舊一點的編譯器會不接受這種語法,因為它認為類的靜態成員在聲明時定義初始值是非法的;而且,類內只允許初始化整數類型(如:int, bool, char 等),還只能是常量。
在上面的語法不能使用的情況下,可以在定義時賦初值:
class EngineeringConstants { // this goes in the class
private: // header file
static const double FUDGE_FACTOR;
...
};
// this goes in the class implementation file
const double EngineeringConstants::FUDGE_FACTOR = 1.35;


大多數情況下你只要做這么多。唯一例外的是當你的類在編譯時需要用到這個類的常量的情況,例如上面GamePlayer::scores數組的聲明(編譯過程中編譯器一定要知道數組的大小)。所以,為了彌補那些(不正確地)禁止類內進行整型類常量初始化的編譯器的不足,可以采用稱之為“借用enum”的方法來解決。這種技術很好地利用了當需要int類型時可以使用枚舉類型的原則,所以GamePlayer也可以象這樣來定義:
class GamePlayer {
private:
enum { NUM_TURNS = 5 } // "the enum hack" ― makes
// NUM_TURNS a symbolic name 
// for 5
int scores[NUM_TURNS];// fine
};


除非你正在用老的編譯器(即寫于1995年之前),你不必借用enum。當然,知道有這種方法還是值得的,因為這種可以追溯到很久以前的時代的代碼可是不常見的喲。


回到預處理的話題上來。另一個普遍的#define指令的用法是用它來實現那些看起來象函數而又不會導致函數調用的宏。典型的例子是計算兩個對象的最大值:
#define max(a,b) ((a) > (b) ? (a) : (b))


這個語句有很多缺陷,光想想都讓人頭疼,甚至比在高峰時間到高速公路去開車還讓人痛苦。
無論什么時候你寫了象這樣的宏,你必須記住在寫宏體時對每個參數都要加上括號;否則,別人調用你的宏時如果用了表達式就會造成很大的麻煩。但是即使你象這樣做了,還會有象下面這樣奇怪的事發生:


int a = 5, b = 0;
max(++a, b);// a 的值增加了2次
max(++a, b+10); // a 的值只增加了1次


這種情況下,max內部發生些什么取決于它比較的是什么值!
幸運的是你不必再忍受這樣愚笨的語句了。你可以用普通函數實現宏的效率,再加上可預計的行為和類型安全,這就是內聯函數(見條款33):
inline int max(int a, int b) { return a > b ? a : b; }
不過這和上面的宏不大一樣,因為這個版本的max只能處理int類型。但模板可以很輕巧地解決這個問題:
template<class T>
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; }


這個模板產生了一整套函數,每個函數拿兩個可以轉換成同種類型的對象進行比較然后返回較大的(常量)對象的引用。因為不知道T的類型,返回時傳遞引用可以提高效率(見條款22)。


順便說一句,在你打算用模板寫象max這樣有用的通用函數時,先檢查一下標準庫(見條款49),看看他們是不是已經存在。比如說上面說的max,你會驚喜地發現你可以后人乘涼:max是C++標準庫的一部分。
有了const和inline,你對預處理的需要減少了,但也不能完全沒有它。拋棄#include的日子還很遠,#ifdef/#ifndef在控制編譯的過程中還扮演重要角色。預處理還不能退休,但你一定要計劃給它經常放長假

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
最好2018中文免费视频| 国产一二三区精品视频| 国产探花在线观看| 最近免费中文字幕大全免费第三页| 色中文字幕在线| 欧美日韩久久中文字幕| 青草青在线视频| **三级三级97片毛片| 国产欧美一区二区三区小说| 国产福利电影在线| 日日夜夜中文字幕| 四虎影院成人| 国产乱人视频免费播放| 国产二区视频| 精品资源在线看| 精品一区二区三区在线成人| 欧美xxxx黑人又粗又长| 91caoporn在线| 在线观看精品视频一区二区三区| 天天插天天射| 国产国产人免费人成免费视频| 99热国产在线| 天堂在线看视频| 性国产高清在线观看| 国产天堂av| 国产主播福利在线| 91这里只有精品| 国产在线精品一区二区不卡| 在线播放国产区| 在线国产一区二区三区| 国产精品白浆流出视频| 国产免费a∨片在线观看不卡| 精品欧美色视频网站在线观看| 久久er视频| 狂野欧美性猛交xxxx乱大交| 在线观看视频污| 精品视频一区二区观看| 国产视频xxxx| 国产精品剧情一区二区在线观看 | 国产白浆在线| 国产小视频在线播放| 天堂在线免费观看| 男人天堂亚洲| 国产又色又爽又黄刺激在线视频| 人人九九精品| www在线观看播放免费视频日本| 国产www视频在线观看| 国产激情自拍视频| 伊人精品影院| 日本成人在线播放| 久热免费在线视频| 欧美啪啪精品| 丁香花在线电影小说观看| 久久99精品久久久久久野外| 日本一二区视频| 国产在线观看18| 国产视频中文字幕| 一本久久精品| 开心丁香婷婷深爱五月| 久草网在线视频| 国产三级免费观看| 四虎国产精品永久| 尤物视频在线免费观看| 伊人狠狠av| 成人免费一区二区三区牛牛| 国产日本视频| 亚洲精品视频在线免费| 国产主播福利在线| 国产日韩欧美精品一区二区三区| 91欧美在线视频| 国产美女视频网站| 在线天堂中文www视软件| av在线播放网| 国产丝袜精品丝袜| 欧美在线中文| 中文av字幕| 中文字幕网站视频在线| 99re在线视频| 国产深夜福利| 九色成人在线| 在线成人一区| 国产区成人精品视频| 日本成a人片在线观看| 国产精品剧情一区二区三区| 成 人免费视频播放| 亚洲精品影视在线| 精品视频vs精品视频| 最新av中文字幕| 激情丁香婷婷| 免费a在线观看| 欧美色欧美亚洲另类二区精品| 国产三级在线| 国产呻吟对白刺激无套视频在线| 亚洲免费国产| 先锋av资源网| 日本在线天堂| av免费在线观| a中文在线播放| 亚洲精品在线播放视频| 99久久99久久免费精品小说| 国产高清在线视频| 精品欧美不卡一区二区在线观看| 91福利在线免费| 国产精品视频一区麻豆| 国产深夜福利| 国产对白国语对白| 精品国产高清自在线一区二区三区| 国产三区视频在线观看| 中文字幕视频在线观看| 国产视频在线播放| 精品176二区| 97在线超碰| 午夜影院在线| 九九热精品在线视频| 国产又色又爽又黄刺激在线视频| 蜜桃视频中文字幕| 午夜国产福利在线| 国产人成在线视频| 在线观看的av网站| 欧美性猛交xxxx免费看蜜桃| 黄色片免费在线| 国产成人精品实拍在线| 日韩欧美中文字幕不卡| 久久久久久国产视频| 国产精品一区二区婷婷| 精品国产一区二区三区四区阿崩 | 国产变态拳头交视频一区二区| 97国产视频| 交视频在线观看国产| 国产一级电影网| 天天插天天操| 国产羞羞视频在线播放| av丝袜在线| 国产美女在线观看| 伊人网在线视频| 中文字幕高清av| 中文字幕av高清| 丁香婷婷在线| av在线免费观看网| 国产福利电影在线| 成人免费一区二区三区视频网站| 国产激情视频在线观看| 麻豆av在线| av在线播放国产| 国产91足控脚交在线观看| 豆国产97在线|亚洲| 亚洲久草视频| 国产天堂资源| 国产精品作爱| 国内精品一区视频| 日本aⅴ写真网站免费| 国产成人精品实拍在线| 午夜视频99| 黄色国产在线| 看成年女人免费午夜视频| 在线色视频网| 伊人影院在线播放| 国产极品视频| 国产精品jvid在线观看| 国产一区二区三区美女秒播| 狠狠操狠狠色| 尤物网在线观看| 九九热在线视频观看| 免费一区二区在线观看| 青青青国产视频| 啪啪免费视频一区| yjizz视频网站在线播放| www在线播放| 日本成人a视频| 毛片在线视频| 最新黄网在线观看| 国产黄网站在线观看| 精品卡1卡2卡三卡免费网站| 99久久精品免费观看国产| 亚洲an天堂an在线观看| 亚洲va国产日韩欧美精品色婷婷| 三级小说一区| 国产一区二区影视| 国产福利在线播放麻豆| 精品99又大又爽又硬少妇毛片| 国产不卡一卡2卡三卡4卡5卡在线| 最近中文字幕大全中文字幕免费 | 依依成人在线| 国产麻豆高清视频在线第一页| 国产麻豆麻豆| 在线伊人免费视频| 九九热在线观看| 国产精品69一区二区三区| 国产91足控脚交在线观看| 伊人影院在线观看| 国产一区二区三区不卡在线| 国产98在线| 黄色毛片在线| 91午夜视频| 中文字幕乱在线伦视频乱在线伦视频| 97最新国自产拍视频在线完整在线看| 久热精品免费视频| 精品麻豆视频| 国产一卡2卡3卡4卡网站免费| 在线免费日韩|