目錄
一。巨集定義函式和函式的區別
二。巨集定義和內斂函式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的作用,塊元素會順序以每次另起一行的...