位置:首頁(yè) > 軟件操作教程 > 編程開(kāi)發(fā) > C語(yǔ)言 > 問(wèn)題詳情

C語(yǔ)言 無(wú)參宏的定義與使用

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-01

無(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代替。

繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部