C語(yǔ)言 無(wú)參宏的定義與使用
無(wú)參宏就是用一個(gè)標(biāo)識(shí)符代表一個(gè)字符串,程序中使用到無(wú)參宏的地方,預(yù)處理時(shí)會(huì)直接用該字符串替換無(wú)參宏。
對(duì)于宏的操作包括:宏定義、宏調(diào)用以及宏展開(kāi)。
1.無(wú)參宏的定義形式
#define標(biāo)識(shí)符字符串
例如:
#define PI 3.14159
說(shuō)明:
①“#”表示這是一條預(yù)處理命令,“define”是宏定義命令,“標(biāo)識(shí)符”是所定義的宏名,“字符串”可以是一個(gè)任意類(lèi)型的常數(shù)、表達(dá)式、格式串等。
②宏名一般建議使用大寫(xiě)字母表示,以和普通變量區(qū)分開(kāi)。
2.宏調(diào)用
在程序中當(dāng)需要使用一個(gè)字符串時(shí),用宏名表示。
例如,一個(gè)求圓面積和周長(zhǎng)的程序如下:
#include <stdio.h>
#define PI 3.14159 /* 此處為宏定義 */
main()
{
int r=3;
float s,c;
printf("input radius:\n");
scanf ("%d",&r);
s=PI*r*r; /* 宏定義 */
c=2*PI*r; /* 宏定義 */
printf("s=%f ,c=%f\n",s,c);
}
程序中,無(wú)參宏P(guān)I-?旦定義,就可以在程序中用到 “3.14159” 的地方用PI來(lái)表示。
3.宏展開(kāi)
編譯預(yù)處理時(shí)用宏代表的字符串替換宏名的過(guò)程,稱為宏展開(kāi),例如上述程序,宏展開(kāi)后就成為:
main()
{
int r=3;
float s,c;
printf("input radius:\n");
scanf("%d",&r);
s=3.14159*r*r;
c=2*3.14159*r;
printf("s=%f,c=%f\n",s,c);
}
4.關(guān)于無(wú)參宏的使用說(shuō)明
①宏定義不是C語(yǔ)言語(yǔ)句,不能在行尾加分號(hào)“;”,否則,宏展開(kāi)時(shí),會(huì)將分號(hào)作為字符串的一部分一起展開(kāi)替換宏名。例如:
#define PI 3.14159;
展開(kāi)時(shí)就會(huì)成為如下形式:
s=3.14159;*r*r;
②宏定義命令#define出現(xiàn)在函數(shù)的外部,宏名的有效范圍是:從定義命令之后到本文件結(jié)束。通常,宏定義命令放在文件開(kāi)頭處。在程序中可以使用#undef命令終止宏定義的作用域,例如:
#include <stdio.h>
#define N 100
#define PI 3.14
main
{
…
}
#undef N
void fun()
{
…
}
由于#undef的作用,使宏f\ffimain()函數(shù)結(jié)束時(shí)就終止,所以fun()函數(shù)出現(xiàn)N也不代表100,但PI的作用域從開(kāi)始定義一直到文件結(jié)束。使用#undef可以靈活地控制宏的作用范圍。
③預(yù)處理器在用字符串替換程序中出現(xiàn)的宏時(shí),只是簡(jiǎn)單地替換,并不做語(yǔ)法檢查。例如,假設(shè)設(shè)計(jì)者手誤,將3.14159寫(xiě)成了3.f4159:
#define PI 3.f4159
程序在編譯時(shí)會(huì)出現(xiàn)“操作數(shù)無(wú)效”的錯(cuò)誤。
5.無(wú)參宏的應(yīng)用
無(wú)參宏在實(shí)際中可以應(yīng)用到很多方面,主要有以下幾個(gè)方面:
(1)符號(hào)常量
如前面用到的PI、N都是符號(hào)常量的形式。
恰當(dāng)命名的符號(hào)常量能表達(dá)出宏所代表的字符串常量的實(shí)際含義,從而增強(qiáng)程序的可讀性。例如:
#deflne EOF -1 /* 文件尾 */
#define NULL 0 /* 空指針 */
(2)用宏定義表示數(shù)據(jù)類(lèi)型
用宏定義表示一個(gè)數(shù)據(jù)類(lèi)型,在程序中使用宏來(lái)定義數(shù)據(jù),非常方便且直觀,例如:
#deflne SINGLE float
程序中,就可以使用SINGLE定義單精度變量,如:
SINGLE x, y:
(3)用宏定義表示輸入和輸出
例如:
#deflne PI 3.14
#define S PI*r*r
樸 define OUT printf("%f ",S)
#deflne IN scanf("%d",&r)
main ()
{
int r;
IN;
OUT;
}
IN代表輸入函數(shù)scanf(),OUT代表輸出函數(shù)printf()。
(4)用宏定義表示輸出格式
上題所用的丨N和OUT不具備通用性,如果將程序稍作改變:
#define PI 3.14
#deflne S PI*r*r
#deflne F "%f"
#deflne D "%d"
#define OUT printf
#define IN scanf
main()
{
int r=3;
IN(D,&r);
OUT(F,S):
}
程序中用宏F代表格式字符"%f",用宏D代表格式字符"%d",這樣凡是在程序中需要用到這兩個(gè)格式字符的地方全部可以用F、D代替。
點(diǎn)擊加載更多評(píng)論>>