C語言define 與const

前言:最近看到一篇比較詳細的描寫C語言之const與define區別對的博文,經博主同意轉發分享一哈

define 與const
符號變量define是預編譯指令,在預編譯的時候僅僅進行字符替換,預編譯後符號常量就不存在了,例如define PI 3.1415926 ,編譯以後就不存在PI了,所有的PI都被換成了3.1415926。而且PI沒有存儲單元。而常變量const變量要佔用存儲單元,有變量值,只是值不能改,它有符號變量的優點,而且比較方便。其實還有一個static,不過這是C語言,就不說它了。
具體可以分爲:
(1)const定義的常數帶類型,define不帶類型,
(2)const是在 編譯、運行的時候起作用,而define是在編譯的預處理階段起作用。
(3)define只是簡單的字符串替換,沒有類型檢查。而const有對應的數據類型,是要進行判斷的,可以避免一些低級的錯誤。
define只是簡單的字符串替換會導致邊界效應,比如定義
#define A 1
#define B A+3
#define C A/B3
那麼c是多少呢?c=A/B
3=A/A+33=1/1+33=10;
所以這種用的時候可以直接都用個括號括起來,就不怕邊界效應了。
(4)define預處理後佔用代碼空間,而const佔用數據段空間。
(5) const常量可以進行調試的,define是不能進行調試的,主要是預編譯階段就已經替換掉了,調試的時候就沒它了。
(6)const不能重定義,不可以定義兩個一樣的,而define就比較牛氣了,它通過undef取消某個符號的定義,再重新定義。
(7) define可以用來防止頭文件重複引用,而const不能。舉例:

#ifndef GRAPHICS_H // 防止graphics.h被重複引用
#define GRAPHICS_H
……代碼……
#endif

這裏要說一下有些頭文件重複引用只是增加了編譯工作的工作量,不會引起太大的問題,僅僅是編譯效率低一些,但是對於大工程而言編譯效率低下那將是一件多麼痛苦的事情;有些頭文件重複包含,會引起錯誤,比如在頭文件中定義了全局變量這種會引起重複定義
,雖然C規範允許,但是不推薦這樣用啊。

(8)使用define會使得代碼看起來非常簡單,而const無法實現該功能
例如,MFC在實現六大核心機制中,大量使用了define
1、MFC程序的初始化
2、運行時類型識別(RTTI)
3、動態創建
4、永久保存
5、消息映射
6、消息傳遞
define和const直接的區別在某個點上同C語言與JAVA語言有一定的相似性:
(1) JAVA中內部對象高度封裝,比如對於內存的回收機制而言更是自動完成,不需要程序員多費心;而C語言中,每次我們用指針申請一段空間時,我們都需要仔細考慮,這個指針後面會不會還要使用,現在是不是可以釋放了,會不會成爲野指針等等問題,所有的內存相關問題都需要程序員自己考慮,但是好處是,C語言可以直接方便的操作內存,這是一把雙刃劍,用得好事半功倍,用得不好,內存泄漏,指針跑飛,問題到處都是。
(2) C語言和JAVA語言的差異點類比到define和const,要強調的是define的作用非常強大,雖然它沒有類型檢測,不能調試,還要考慮邊界效應,但是正因爲沒有類型檢測,預編譯是就完成,才使得它的使用更加靈活,功能更加強大。

作者:Love_Cpp_forever
原文:C語言之const與define區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章