小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

宏定義和常量定義的區(qū)別

 小力·大力 2016-11-27

1.效果-《高質(zhì)量C++/C編程指南》

C++ 語言可以用const 來定義常量,也可以用#define 來定義常量。但是前者比后者有更多的優(yōu)點:
(1) const 常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對前者進(jìn)行類型安全檢查。而對后者只進(jìn)行字符替換,沒有類型安全檢查,并且在字符替換可能會產(chǎn)生意料不到的錯誤(邊際效應(yīng))。
(2) 有些集成化的調(diào)試工具可以對const 常量進(jìn)行調(diào)試,但是不能對宏常量進(jìn)行調(diào)試。規(guī)則5-2-1:在C++ 程序中只使用const 常量而不使用宏常量,即const 常量完全取代宏常量。

2.實現(xiàn)機(jī)制

宏是預(yù)處理命令,即在預(yù)編譯階段進(jìn)行字節(jié)替換。const常量是變量,在執(zhí)行時const定義的只讀變量在程序運行過程中只有一份拷貝(因為它是全局的只讀變量,存放在靜態(tài)存儲區(qū)的只讀數(shù)據(jù)區(qū)。根據(jù)c/c++語法,當(dāng)你聲明該量為常量,即告訴程序和編譯器,你不希望此量被修改。 程序的實現(xiàn),為了保護(hù)常量,特將常量都放在受保護(hù)的靜態(tài)存儲區(qū)內(nèi)。凡是試圖修改這個區(qū)域內(nèi)的值,都將被視為非法,并報錯。 這不能理解為凡是字符串都是放在靜態(tài)存儲區(qū)域的。這個跟數(shù)據(jù)類型沒有關(guān)系,而是這個量是變量還是常量的問題。例如,一個字符串變量就是可以被修改的。 這種靜態(tài)存儲區(qū)域的保護(hù)機(jī)制是由編譯器實現(xiàn)的,而非存儲該值的內(nèi)存的電器屬性。換言之,實質(zhì)上內(nèi)存永遠(yuǎn)都可以被用戶隨意修改,只是編譯器給用戶的代碼注入了一些自己的保護(hù)代碼,通過軟件手段將這段內(nèi)存軟保護(hù)起來。這種保護(hù)在匯編級別可以輕松突破,其保護(hù)也就無效了。)。

3.用法區(qū)別

define宏定義和const常變量區(qū)別:
1.define是宏定義,程序在預(yù)處理階段將用define定義的內(nèi)容進(jìn)行了替換。因此程序運行時,常量表中并沒有用define定義的常量,系統(tǒng)不為它分配內(nèi)存。const定義的常量,在程序運行時在常量表中,系統(tǒng)為它分配內(nèi)存。
2.define定義的常量,預(yù)處理時只是直接進(jìn)行了替換。所以編譯時不能進(jìn)行數(shù)據(jù)類型檢驗。const定義的常量,在編譯時進(jìn)行嚴(yán)格的類型檢驗,可以避免出錯。3.define定義表達(dá)式時要注意“邊緣效應(yīng)”,例如如下定義:
#define N 2+3 //我們預(yù)想的N值是5,我們這樣使用N,int a = N/2; //我們預(yù)想的a的值是2.5,可實際上a的值是3.5原因在于在預(yù)處理階段,編譯器將 a = N/2處理成了 a = 2+3/2;這就是宏定義的字符串替換的“邊緣效應(yīng)”因此要如下定義:#define N (2+3)。const定義表達(dá)式?jīng)]有上述問題。const定義的常量叫做常變量原因有二:const定義常量像變量一樣檢查類型;const可以在任何地方定義常量,編譯器對它的處理過程與變量相似,只是分配內(nèi)存的地方不同。

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多