什麼是巨集定義巨集定義的引數
巨集定義是C語言提供的三種預處理功能的其中一種,那麼你對巨集定義瞭解多少呢?以下是由小編整理關於什麼是巨集定義的內容,希望大家喜歡!
巨集定義的介紹
計算機預處理包括:巨集定義、檔案包含、條件編譯。巨集定義和操作符的區別是:巨集定義是替換,不做計算,也不做表示式求解。
巨集定義的引數
不帶引數
巨集定義又稱為巨集代換、巨集替換,簡稱“巨集”。
格式:
#define 識別符號 字串
其中的識別符號就是所謂的符號常量,也稱為“巨集名”。
預處理***預編譯***工作也叫做巨集展開:將巨集名替換為字串。
掌握"巨集"概念的關鍵是“換”。一切以換為前提、做任何事情之前先要換,準確理解之前就要“換”。
即在對相關命令或語句的含義和功能作具體分析之前就要換:
例:
#define Pi 3.1415926
把程式中出現的Pi全部換成3.1415926
說明:
***1***巨集名一般用大寫
***2***使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:陣列大小常用巨集定義
***3***預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。
***4***巨集定義末尾不加分號;
***5***巨集定義寫在函式的花括號外邊,作用域為其後的程式,通常在檔案的最開頭。
***6***可以用#undef命令終止巨集定義的作用域
***7***巨集定義允許巢狀
***8***字串*** " " ***中永遠不包含巨集
***9***巨集定義不分配記憶體,變數定義分配記憶體。
***10***巨集定義不存在型別問題,它的引數也是無型別的。
帶引數
除了一般的字串替換,還要做引數代換
格式:
#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***巨集展開不佔執行時間,只佔編譯時間,函式呼叫佔執行時間***分配記憶體、保留現場、值傳遞、返回值***