1. 程式人生 > >巨集定義與符號常量

巨集定義與符號常量

在C中,“巨集”分為無引數的巨集和有引數的巨集兩種

  1. 無參巨集定義
    (1)無參巨集定義的一般格式:#define 識別符號 語言符號 字串
    其中:"define"為巨集定義命令;"識別符號"為所定義的巨集名,通常用大寫字母表示,以便於與變數區別;“語言符號字串”可以是常數,表示式,格式串等。
    (2)使用巨集定義的優點
    可提高源程式的可維護性;可提高源程式的可移植性;減少源程式中重複書寫字串的工作量。
    例如:
#define PI 3.1415926
main()
{
	foat radius,length,area,volume;
	printf("Input a radius");
	scanf("%f",&radius);
	length=2*PI*radius;/*引用無參巨集求周長*/
	area=PI*radius*radius;/*引用無參巨集求面積*/
	volume=PI*radius*radius*radius*3/4;/*引用無參巨集求體積*/
	printf("length=%.2f,area=%.2f,volume=%.2f\n",length,area,volume);
}

(3)說明
巨集名一般用大寫字母表示,以示與變數區別。但這並非規定;
巨集定義不是C語句,所以不能在行尾加分號,否則,巨集展開時,會將分號作為字串的一個字元,用於替換巨集名;
在巨集展開時,預處理程式僅以按巨集定義簡單替換巨集名,而不做任何檢查。如果有錯誤,只能由編譯程式在編譯巨集展開後的源程式時發現;
巨集定義命令#define出現在函式的外部,巨集名的有效範圍是:從定義命令之後,到本檔案結束。通常,巨集定義命令放在檔案開頭處;
在進行巨集定義時,可以引用已定義的巨集名;
對雙引號括起來的字串內的字元,即使與巨集名同名,也不進行展開。

  1. 符號常量
    在定義無參巨集時,如果“語言符號字串”是一個常量,則相應的“巨集名”就是一個符號常量。恰當地命名符號常量,除具有巨集定義的上述優點外,還能表達出它所代表常量的實際含義,從而增強程式的可讀性。
    例:
#define EOF -1  /*檔案尾*/
#define NULL 0 /*空指標*/
#define MIN 1  /*極小值*/
#define MAX  /*極大值*/
#define STEP 2 /*步長*/
  1. 有參巨集定義
    (1)有參巨集定義的一般格式
    #define 巨集名(形參表)語言符號字串
    (2)帶參巨集的呼叫和巨集展開
    呼叫格式:巨集名(引數表)
    巨集展開:用巨集呼叫提供的實參字串,直接置換巨集定義命令列中相應形參字串,非形參字串保持不變。
    例:
#define MU(a,b)  a*b
main ()
{
	int sum;
	sum=MU(5+2,7-3);
	printf("%d",sum);
}

(3)說明
定義有參巨集時,巨集名與左圓括號之間不能留有空格。否則,C編譯系統將空格以後的所有字元均作為替代字串,而將該巨集視為無參巨集;
有參巨集展開,只是將實參作為字串,簡單地置換形參字串,而不做任何語法檢查。在定義有參巨集時,在所有形參外和整個字串外,均加一對圓括號。
雖然有參巨集與有參函式確實有相似之處,但是不同之處更多,主要有一下幾個方面:
呼叫有參函式時,是先求出實參的值,然後再複製一份給形參。而展開有參巨集時只是將實參簡單地置換形參;
在有參函式中,形參是有型別的,所以要求實參的型別與其一直;而在有參巨集中,形參沒有任何的型別資訊,因此用於置換實參,什麼型別都可以。有時,可利用有參巨集的這一特性,實現通用函式功能;
使用有參函式,無論呼叫多少次,都不會使目標程式變長,但每次呼叫都要佔用系統時間進行呼叫現場保護和現場恢復;而使用有參巨集,由於巨集展開實在編譯時進行的,所以不佔用執行時間,但是每引用一次,都會使目標程式增大1次。