c語言巨集定義簡單函式的好處?
因為呼叫函式要有引數壓棧 過程記錄儲存 返回 過程記錄的返回等額外開銷 所以巨集的效率一般要高些。
巨集定義不佔執行時間,只佔編譯時間。而函式呼叫則佔執行時間。
巨集就是在生成exe等可執行檔案的時候就處理好了,函式則是在執行這個exe檔案的時候才處理。
巨集好比是去館子吃飯,函式好比是自己買菜回家做飯
因為如果要有頻繁的函式呼叫,增加了執行時的開銷,效率不如巨集,**效率上巨集和內聯函式一樣. 對於很短的函式,巨集書寫要簡單一點(不需要寫函式)
並且如你想修改下你**中的值,你只需修改巨集定義即可。
用#define 來定義,如#define max 100
優點:在以後的程式中 要修改max的大小 不用跑到程式中找 直接修改
#define max 的大小即可。很方便。
主要用於函式重定義,通用性,可以用乙個變數符號替代另乙個變數符號
格式:#define m(x,y) x+y
在主程式裡寫入z=m(6,9);等價於z=6+9;而寫成z=(6-8,9);等價於z=6-8+9 ;直接代入
還有就是 :#define uint unsigned int 即用 uint 代替unsigned int 便於書寫,還有就是不同作業系統的通用變數識別
巨集定義巨集定義是c提供的三種預處理功能的其中一種,這三種預處理包括:巨集定義、檔案包含、條件編譯
編輯本段1.不帶引數的巨集定義:
巨集定義又稱為巨集代換、巨集替換,簡稱「巨集」。
格式#define 識別符號 字串
其中的識別符號就是所謂的符號常量,也稱為「巨集名」。
預處理(預編譯)工作也叫做巨集展開:將巨集名替換為字串。
掌握"巨集"概念的關鍵是「換」。一切以換為前提、做任何事情之前先要換,準確理解之前就要「換」。
即在對相關命令或語句的含義和功能作具體分析之前就要換:
例: #define pi 3.1415926
把程式中出現的pi全部換成3.1415926
說明:
(1)巨集名一般用大寫
(2)使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:陣列大小常用巨集定義
(3)預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。
(4)巨集定義末尾不加分號;
(5)巨集定義寫在函式的花括號外邊,作用域為其後的程式,通常在檔案的最開頭。
(6)可以用#undef命令終止巨集定義的作用域
(7)巨集定義可以巢狀
(8)字串" "中永遠不包含巨集
(9)巨集定義不分配記憶體,變數定義分配記憶體。
編輯本段2.帶引數的巨集定義:
除了一般的字串替換,還要做引數代換
格式:
#define 巨集名(參數列) 字串
例如:#define s(a,b) a*b
area=s(3,2);第一步被換為area=a*b; ,第二步被換為area=3*2;
類似於函式呼叫,有乙個啞實結合的過程:
(1)實參如果是表示式容易出問題
#define s(r) r*r
area=s(a+b);第一步換為area=r*r;,第二步被換為area=a+b*a+b;
正確的巨集定義是#define s(r) ((r)*(r))
(2)巨集名和引數的括號間不能有空格
(3)巨集替換只作替換,不做計算,不做表示式求解
(4)函式呼叫在編譯後程式執行時進行,並且分配記憶體。巨集替換在編譯前進行,不分配記憶體
(5)巨集的啞實結合不存在型別,也沒有型別轉換。
(6)函式只有乙個返回值,利用巨集則可以設法得到多個值
(7)巨集展開使源程式變長,函式呼叫不會
(8)巨集展開不佔執行時間,只佔編譯時間,函式呼叫佔執行時間(分配記憶體、保留現場、值傳遞、返回值
c語言巨集定義技巧(常用巨集定義)
寫好c語言,漂亮的巨集定義很重要,使用巨集定義可以防止出錯,提高可移植性,可讀性,方便性 等等。下面列舉一些成熟軟體中常用得巨集定義。。。。。。
在提供布林型別的高階語言當中,通常使用true和false來表示邏輯表示式運算的結果,但是在c語言當中沒有布林型別,所以用非零表示true,用零表示false
#define true 1
#define false 0
恰當的使用c語言當中的預處理功能,能擴充套件c語言的程式設計環境,可以編寫出易讀、易改、便於移植和除錯的c語言程式,有利於軟體工程的模組化設計。
巨集定義 檔案包含 和條件編譯 是c語言提供的三種預處理功能。
c語言的預處理程式負責分析和處理以#為首字元的預處理控制行。預處理控制行就是以上三種。
由於預處理是在編譯系統開始工作之前進行的,所以將執行預處理功能的這部分程式稱為預處理程式。
便於修改,閱讀,擴充和移植程式。
從語法角度來說,預處理控制行並不屬於真正的c語言的語句,他們可以出現在程式**的任何地方,在他們的出現點後開始有效,通常巨集替換和檔案包含出現在檔案的開頭。預處理控制航的作用範圍僅限於說明他們的檔案,超出了該範圍就失去作用。
#includeusing namespace std;
#define max(a,b) a>b?a:b
#define abs(x) x>0?x:-x
#define cub(x) x*x*x
#define even(x) x%2==0?1:0
#define swap(m,n,t) t=n;n=m;m=t
#define swap2(m,n) m^=n;n^=m;m^=n
int main()
巨集的一些使用
巨集定義函式兩個注意點:
1.#define 最後不要加「;」
2.最好把所有變數都加上括號
於是 #define max(a,b) ((a)>(b)?(a):(b))
#define cub(x) ((x)*(x)*(x))
多加那些括號是必須的.
比如有巨集定義 : fn(a,b) (a*b)
那麼如果你在**中寫 fn(1+2, 3+4)
那麼預處理的結果就成了 1+2*3+4,
寫乙個「標準」巨集min ,這個巨集輸入兩個引數並返回較小的乙個。#define min(a,b) ((a) <= (b) ? (a) : (b))
如果不加括號:寫下面這段**會發生什麼
least = min(*p++, b);
加括號是為了處理表示式引數(即巨集的引數可能是個演算法表示式)時不出錯,因為巨集替換就是文字替換,所以如果有以下情況:來個指標的例子,比如說釋放記憶體.#define com(a,b) (a)*(b)
那麼com(6+5,3)這個呼叫會怎麼替換呢?它會換成這樣:
(6+5)*(3)
顯然這是和com巨集的意圖一致的,但是如是去掉了定義中括號,即寫成這樣:
#define com(a,b) a*b
那麼com(6+5,3)這個呼叫會怎麼替換呢?它就會換成這樣:
6+5*3
這樣顯然就和巨集的意圖不符合了。
但是你所寫出的程式中的引數(即*p++和b)呼叫原程式的巨集,這兩種情況沒區別.加括號是為了更通用。
#define release_new_buf(x) if(x)
注意release_new_buf後面不要有空格!
C語言中的巨集
c語言中如何使用巨集c 和c 中的巨集 macro 屬於編譯器預處理的範疇,屬於編譯期概念 而非執行期概念 下面對常遇到的巨集的使用問題做了簡單總結。在c語言的巨集中,的功能是將其後面的巨集引數進行字串化操作 stringfication 簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上乙個...
c語言中的「巨集」
簡單來說 巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 是c提供的三種預處理功能的其中一種。複雜的請看下面,講的很全。下面的帶參巨集定義,多行巨集定義,在linux核心原始碼中很多。另外sizeof也是乙個巨集定義。巨集定義巨集定義是c提供的三種預處理功能的其中一種,這三種預處理包括 巨集定義 檔案...
C語言中的巨集
巨集是編譯器的東西,是純粹的 字元替換 與程式語言其他什麼一切都無關。僅僅是幫助你更好地輸入字元。例如 下面程式 void main 相信你輸入程式時候很苦惱,並且如果其中某個3.1415926535897932384626433832795被錯改了一小數字的話,造成的錯誤極其難發現。所以,利用字元...