程式設計基礎 const與 define的區別

2022-02-01 12:14:09 字數 1430 閱讀 5716

【前言】

相信大家看別人**的時候都遇到過,有人用#define定義,也有人用const定義。

那麼兩者的區別到底是什麼呢?哪個更好用呢?

網上查了又查,下面總結一下。

【總結】

#define巨集是在預處理階段展開

const常量是編譯執行階段使用

#define巨集沒有型別,不做任何型別檢查,僅僅是展開

const常量有具體的型別,在編譯階段會執行型別檢查

#define巨集僅僅是展開,有多少地方使用,就展開多少次,不會分配記憶體

const常量會在記憶體中分配(可以是堆中也可以是棧中)

#define pi 3.14159 //常量巨集  

const doulbe pi=3.14159; //此時並未將pi放入rom中 ......  

double i=pi; //此時為pi分配記憶體,以後不再分配!  

double i=pi; //編譯期間進行巨集替換,分配記憶體  

double j=pi; //沒有記憶體分配  

double j=pi; //再進行巨集替換,又一次分配記憶體!  

const定義常量從彙編的角度來看,只是給出了對應的記憶體位址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程式執行過程中只有乙份   拷貝,而 #define定義的常量在記憶體中有若干個拷貝。 

編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的常量,沒有了儲存與讀記憶體的操作,提高了效率

在c++中程式只使用const常量而不使用巨集常量,即const常量完全取代巨集常量

如果某一常量與其它常量密切相關,應在定義中包含這種關係,而不應給出一些孤立的值

1

//例如

2const

float radius = 100;3

const

float diameter = radius * 2;

1

class

a

1

class

a5 a::a(int size) : size(size)

8 a a(100); //

物件 a 的size值為100

9 a b(200); //

物件 b 的size值為200

1

class

a; //

列舉常量

4int

array1[size1];

5int

array2[size2];6};

7//列舉常量不會占用物件的儲存空間,它們在編譯時被全部求值。8//

列舉常量的缺點是:它的隱含資料型別是整數,其最大值有限,且不能表示浮點數(如pi=3.14159)。

就這麼多吧,不深究了

C 基礎2 6盡量用const代替define

2.6盡量用const代替define c define max 1024 c const int max 1024 原因 define定義的巨集從未被編譯器看到過,因為在預處理階段,所有的mac都已經被替換成了1024。如果max不在main裡面,編譯出錯會出現1024,不出現max,不容易解決此...

程式語言 const

問題 如果函式需要傳入乙個指標,面試官可能會問是否需要為該指標加上const,把const加在指標不同位置有什麼區別 如果寫的函式需要傳入的引數是乙個複雜型別的例項,面試官可能會問傳入值引數或者引用引數有什麼區別,什麼時候需要為傳入的引用引數加上const?1 const是用來宣告乙個常量的,當你不...

const與指標,const與函式

const與指標 常量指標 指向常量的指標 int b 500 1 const int a b 2 int const a b 以上中 a不允許改變,指標a可變 指標常量 指標本身是常量 3 int const a b 指標a不允許改變,a可改變 常量指標常量 4 const int const a...