1. 程式人生 > >C++中define與const的區別

C++中define與const的區別

C++中不但可以用define定義常量還可以用const定義常量,它們的區別如下:

  • #define MAX 255定義的常量是沒有型別的,所給出的是一個立即數,編譯器只是把所定義的常量值與所定義的常量的名字聯絡起來,define所定義的巨集變數在預處理的時候進行替換,在程式中使用到該常量的地方都要進行拷貝替換;

    const float MAX = 255; 定義的常量有型別名字,存放在記憶體的靜態區域中,在程式執行過程中const變數只有一個拷貝,而#define 所定義的巨集變數卻有多個拷貝,所以巨集定義在程式執行過程中所消耗的記憶體要比const變數的大得多;

  • 用define定義的常量是不可以用指標變數去指向的,用const定義的常量是可以用指標去指向該常量的地址的;

  • 用define可以定義一些簡單的函式,const是不可以定義函式的.

具體來說,有以下幾方面的區別:

1.編譯器處理方式
define – 在預處理階段進行替換
const – 在編譯時確定其值

2.型別檢查
define – 無型別,不進行型別安全檢查,可能會產生意想不到的錯誤
const – 有資料型別,編譯時會進行型別檢查

3.記憶體空間
define – 不分配記憶體,給出的是立即數,有多少次使用就進行多少次替換,在記憶體中會有多個拷貝,消耗記憶體大
const – 在靜態儲存區中分配空間,在程式執行過程中記憶體中只有一個拷貝

4.其他
在編譯時, 編譯器通常不為const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為一個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高。
巨集替換隻作替換,不做計算,不做表示式求解。

巨集定義的作用範圍僅限於當前檔案。
預設狀態下,const物件只在檔案內有效,當多個檔案中出現了同名的const變數時,等同於在不同檔案中分別定義了獨立的變數。
如果想在多個檔案之間共享const物件,必須在變數定義之前新增extern關鍵字(在宣告和定義時都要加)。

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

相關推薦

C++defineconst區別

C++中不但可以用define定義常量還可以用const定義常量,它們的區別如下: 用#define MAX 255定義的常量是沒有型別的,所給出的是一個立即數,編譯器只是把所定義的常量值與所定義的常量的名字聯絡起來,define所定義的巨集變數在預處理的時

C#outref區別

erro 變量 但是 color 賦值 運行 網上 ann amp 一、ref(參考)與out區別 1、out(只出不進) 將方法中的參數傳遞出去,在方法中將該參數傳遞出去之前需要在該方法起始賦初值;在方法外傳遞的該參數可以不用賦值; 簡單理解就是:將一個東西拋出去之前必須

c++->.的區別

首先,->在C++中是指標呼叫的意思。舉個例子: 有一個Phone類(手機),該類有一個成員函式SendMessage()用於發短訊息,通常你要呼叫這個函式,可以先定義一個Phone類的指標*phone,利用這個指標就可以呼叫該函數了: phone->SendMessage(); 其

#defineconst區別總結

一:C++中不但可以用define定義常量還可以用const定義常量,它們的區別如下: #define MAX 255; const float MAX = 255; (1)作用階段: #define-在編譯的預處理階段,編譯器把所定義的常量名字和常量值聯絡起來

C#equal==的區別

vat val ogr htm args 因此 ret 指向 和equal C#中equal與==的區別 來源 https://www.cnblogs.com/dearbeans/p/5351695.html C#中,判斷相等有兩種方式,一種是傳統的==操作,一種

C#StructClass的區別

而是 適用於 ack 定義 cts 多態 支持 關鍵字 for class和struct最本質的區別是class是引用類型,而struct是值類型,它們在內存中的分配情況有所區別。 什麽是class? class(類)是面向對象編程的基本概念,是一種自定義數據結構類型,通

C#結構的區別實例分析

類與結構 main bds nbsp 模擬鼠標 指向 img adding 區別 類與結構是C#程序設計中基本的數據類型,而初學者往往不能很好的分清二者之間的區別。本文就以附帶實例形式加以說明。具體如下: 一、基本概念: 類: 引用類型,存儲在堆中,棧中存儲引用地址

C++compilebuild的區別

build com www ads upload 文件 font mil .com 我在前面的博文就提到了GCC編譯器工作的四個階段:預處理、編譯、匯編、鏈接。 感興趣的同學可以參考:http://www.cnblogs.com/mlgjb/p/7708007.html

C++ defineconst

編譯期 多個 簡單的 存儲空間 const常量 ons efi 指針變量 錯誤 C++中不但可以用define定義常量還可以用const定義常量,它們的區別如下: 用#define MAX 255定義的常量是沒有類型的,所給出的是一個立即數,編譯器只是把所定義的常量值與

C++繼承組合的區別

物件和類是C++中的重要內容,物件(Object)是類(Class)的一個例項(Instance)。面向物件設計的重點是類的設計,而不是物件的設計。對於C++程式而言,設計孤立的類是比較容易的,難的是正確設計基類及其派生類。這就和“繼承”(Inheritance)和“組合”(Composition)

C#boolBoolean有什麼區別

    首先結論:bool和Boolean(System.Boolean)是完全一樣的  MSDN中解釋bool與Boolean的關係是:bool關鍵字是System.Boolean的別名。實際使用無任何差別。它們的成員也是一樣的。    

C++巨集函式的區別

巨集在編譯時就被替換成它內部的語句了,而函式是執行時呼叫的 所以如果是簡單的東西就寫成巨集,這樣沒有呼叫函式的開銷,效率會高一些。相反,由於巨集每被呼叫一次,就相當於把程式碼複製一份,所以如果比較複雜的巨集被多次呼叫的話,會增加程式碼的體積。因此,太複雜的運算就寫成函式比較好了。 另外,要注意在巨集

c#介面抽象類區別

轉載自:https://www.c-sharpcorner.com/article/overview-of-abstract-class-and-interface/ Introduction In this article, I will explain about abstrac

C#Stringstring的區別

string 是 C# 中的類,String 是 .net Framework 的類(在 C# IDE 中不會顯示藍色) C# string 對映為 .net Framework 的String 如果用 string, 編譯器會把它編譯成 String,所以如果

c++vectorlist的區別

c++標準庫中,容器vector和list都可以用來存放一組型別相同的資料。而且二者不同於陣列的一點是,支援動態增長。但它們還是有有幾點不同 (1)  vector是順序表,表示的是一塊連續的記憶體,元素被順序儲存;list是雙向連線表,在記憶體中不一定連續。 (2)當數值

C#集合陣列的區別

                    【前言】剛開始學習的時候沒有仔細去思考,然後這些內容在我腦海中就沒有什麼    印象,問問自己這些有什麼區別也只能籠統的說出一點兒來,所以學習還是要做到顆    粒歸倉的,及時總結是很重要的呀。   陣列:陣列是相同資料型別的元素按

C#變數物件、型別類之間的區別

    在C#中,我們經常通過宣告一個變數來儲存資料,那麼什麼叫宣告(declare)變數呢?宣告變數是指在宣告一個變數時,要告訴程式這個變數的型別(type)和變數名(name),如int n。那什

C#結構的區別

一.類與結構的示例比較: 結構示例: public struct Person { string Name; int height; int weight public bool overWeight() { //implement something } } 類示例:

iOS---Objective-C@class#import的區別

在Objective-C的專案中, @class通常放在.h檔案中, 主要作用在於提升編譯效能, 且能防止標頭檔案的遞迴import. 編譯效能的考慮 通常, 使用#import引入一個類的標頭檔案, 編譯時會將該類的標頭檔案中的所有資訊都引入, 包含屬

C\C++宣告定義的區別

C語言是面向過程的,而C++是面向物件的 C和C++的區別: C是一個結構化語言,它的重點在於演算法和資料結構。C程式的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制)。 C++,首要考慮的是如何構造一個物件模型,讓這