巨集和常量到底選擇什麼?

2021-08-20 08:07:53 字數 1669 閱讀 6615

define語法稱之為預處理命令

預處理**起的作用實際上相當於在編譯之前,在整個**中進行了一次「搜尋、替換」功能.通常情況下不管是聲名字串還是函式其作用主要有兩個:

1.增強**可讀性

2.方便全域性使用和修改一些方法和引數

3.增強復用性

命名規範

tips:

1.通常情況下,習慣將預處理的常量名全大寫,單詞之間用下劃線隔開

(與正常變數區分)。

2.如果是定義常量,若這個常量的適用範圍侷限於.m,那麼習慣性在常量名前

加k,若常量在類之外可見,則通常以類名為字首

編譯器處理方式不同

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

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

型別和安全檢查不同

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

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

儲存方式不同

define巨集僅僅是展開,有多少地方使用,就展開多少次,不會分配記憶體。(巨集定義不分配記憶體,變數定義分配記憶體。)

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

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常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高。

巨集替換只作替換,不做計算,不做表示式求解;

巨集預編譯時就替換了,程式執行時,並不分配記憶體。
define定義的巨集要注意「邊緣效應」,例如:

define n 2 + 3  // 我們預想的n值為5;

int a = n / 2; // 這裡使用的時候我們預想a的值為2.5,可實際上a的值為3.5。

因為在編譯的時候就進行了替換 變成了 int a = 2 + 3 / 2 。(所以一般定義常量巨集需要用()括起來)

帶你分清常量指標和指標常量到底是誰能變

const和 混合使用 常量指標 const a 本質上a是乙個指標,常量表示a的指向是乙個常量,所以a的指向不能改變 指標常量 const a 本質上a是乙個常量,表示是乙個指標型別的常量 簡單的記法就是從左向右讀,const後面跟誰誰不變 但是c 課本上定義的方法是從右往左,具體還需要會使用 i...

收錄量和索引量到底有什麼區別

很多站長每天開啟電腦的第一件事就是檢視自己 的資料,一般比較關注的就是收錄量權重或者預計流量等這些基本問題。但是除了收錄量意外我們還比較關注的就是索引量,很多站長其實並不知道收錄量和索引量到底有什麼區別,甚至有些站長認為收錄量和索引量是兩個一樣的數值。關於這點我們可以用下面一張圖來解釋清楚 1,收錄...

環境變數到底有什麼用?

我們知道當我們編譯並生成乙個exe程式時,要執行此exe程式,需要將編譯過程中依賴的鏈結庫dll檔案都放到附近才可以。如果我們將這些庫目錄加入環境變數後,那麼執行exe時系統會自動到環境變數查詢,查詢到就可以在執行時,隨時載入 這就是環境變數的作用 專案中配置opencv最好是用巨集來配置,這樣即便...