const,巨集和內斂的使用

2021-08-11 13:16:16 字數 2173 閱讀 7859

目錄

一。巨集定義函式和函式的區別

二。巨集定義和內斂函式inline

1.const.

2.enum.

3.inline.

一.巨集定義函式和函式的區別

在c語言中,用巨集定義函式和函式的區別

1.巨集定義函式沒有引數檢驗

比如: 

#define  max(a, b)  a>b? a : b

傳引數的時候我們一定要注意型別

2.**編譯生成的指令不同

巨集定義沒有呼叫和傳參指令,多的是每次呼叫都會編譯生成乙個類似的函式體

3.巨集定義函式應當尤其注意括號問題

括號問題很重要,尤其當引數是表示式的時候,所以我們能新增括號的地方就新增括號

4.注意引數是表示式的問題

引數是表示式括號一定要帶上

引數是表示式時有可能會多計算表示式

5.一些巨集函式會導致底的**執行效率

舉個簡單的例子,有些巨集函式可能會重複計算, 不但會出錯也會導致效率降低

#define max(a, b) a > b ? a : b

max(++a, ++b) 

結果是++a > ++b ? ++a : ++b

但是巨集定義函式看起來像函式,但是卻不會引起函式呼叫引來的額外開銷。

所有巨集函式在c裡有好處,但是也要注意使用,最好(一定)避免表示式傳參。

二.巨集定義和內斂函式inline

我們說說c++中巨集定義的問題, 因為c++中多了內斂函式

effect c++ 條例二是:盡量以const, enum, inline替換#define

1.const

舉個例子hello.c

在編譯階段,首先執行的是預處理階段,預處理階段hello.c被修改為hello.i(文字), 預處理器根據#開頭的命令來修改原始的c程式。

比如巨集定義乙個常量,我們#define max 100

開始預處理器時可能會移除#define 巨集定義, 而在編譯階段就如果max沒進入記號表,那麼當你使用這個常量時出現錯誤可能提醒就是100而不會提到max。你肯定會為此感到差異,一位一般巨集定義都在標頭檔案中,

建議使用const 來定義常量

!!前提說明,用const修飾的變數作為陣列的大小在c++中不會報錯的, 並且c++也支援這樣做, 但是在c中就會報錯,c中只有常量表示式才能作為陣列的大小,這點一定要記住!!

c中用enum是個不錯的選擇。但是注意,列舉元素都有乙個預設值,是從0開始, 當然我們可以指定它們的值。

2.enum 

舉個c++例子

const min 10

enum ;

int a[max];

int b[min];

&min合法, &enum是違法的,會報錯。

那麼我們可以發現,當我們不想讓他人用指標或者引用來修改這個資料時,就可以用enum來實現這個約束。

3.內斂函式

我們來說說內斂函式,內斂函式存在於c++中,內斂函式的宣告前面要新增inline關鍵字。但注意以下幾點:

<1. 在類中定義的函式預設為內斂函式,但是當函式中存在迴圈,遞迴,開關語句,**量大於5行左右會被認為是普通函式。

<2.內斂函式必須和函式體一起宣告才有效。

例如 inline int fun(int i );  //不是內斂函式

inline int fun(int i )  ;    //內斂函式

<3.內斂函式的定義必須出現在第一次呼叫之前

<4.將讀寫成員函式定義為內斂函式將會獲得較好的效率,因為讀寫成員函式會經常呼叫。。

<5.內斂函式有引數檢查機制

巨集定義函式的缺點上面已經有了。想對比於巨集定義函式,內斂函式是真正的函式!它有引數檢查機制,它可以除錯,它沒有上述那麼多缺點。

那麼對比於普通函式,內斂函式沒有普通函式的引數壓棧,生成彙編裡面call呼叫,返回引數,執行return, 普通函式呼叫時首先立即儲存現場->跳轉到執行的呼叫函式->執行->返回儲存的位址繼續執行。

內斂函式是將函式體嵌入到每乙個呼叫處,實行類似巨集定義那樣。所以簡短的1-5行**執行效率是非常高的

總結:

c語言中我們一般使用define巨集定義,(為什麼不使用內斂,內斂函式在c99標準才加入,有的編譯器不支援,這大概就是魯棒性把 - -)。

c++中我們使用inline內斂函式代替巨集定義,包括使用const 和 enum類替換巨集定義

const和巨集定義的區別!!!

巨集的命名規範 一般以專案字首開頭,key結尾。開頭表編譯。巨集的用法 1 定義常用字串。2 定義一段 const與巨集的區別 1 編譯時刻 巨集 預編譯 const command b 編譯階段 編譯。2 巨集不會檢查 錯誤,只是替換,但是const會編譯報錯。3 巨集的好處 定義 或字串 方法 ...

define巨集定義和const

define是在預編譯階段就定義的常量,不占用記憶體空間 const可以在程式的任何時候定義,是乙個全域性的常量,放在記憶體的static部分。define巨集定義沒有指定的型別,而const在定義時就指定了常量的型別。const int p p可變,p指向的物件不可變 int const p p可...

CSS 塊狀元素和內斂聯元素詳解

我們先來分析一下塊級元素 內聯級元素的定義和解析 塊元素 block element 一般是其他元素的容器元素,塊元素一般都從新行開始,它可以容納內聯元素和其他塊元素,常見塊元素是段落標籤 p form 這個塊元素比較特殊,它只能用來容納其他塊元素。如果沒有css的作用,塊元素會順序以每次另起一行的...