什麼是巨集定義巨集定義的引數

  巨集定義是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***巨集展開不佔執行時間,只佔編譯時間,函式呼叫佔執行時間***分配記憶體、保留現場、值傳遞、返回值***