位置:首頁 > 軟件操作教程 > 編程開發(fā) > C語言 > 問題詳情

C語言 無參宏的定義與使用

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

無參宏就是用一個標(biāo)識符代表一個字符串,程序中使用到無參宏的地方,預(yù)處理時會直接用該字符串替換無參宏。

對于宏的操作包括:宏定義、宏調(diào)用以及宏展開。

1.無參宏的定義形式

    #define標(biāo)識符字符串

例如:

    #define PI 3.14159

說明:

①“#”表示這是一條預(yù)處理命令,“define”是宏定義命令,“標(biāo)識符”是所定義的宏名,“字符串”可以是一個任意類型的常數(shù)、表達(dá)式、格式串等。

②宏名一般建議使用大寫字母表示,以和普通變量區(qū)分開。

2.宏調(diào)用

在程序中當(dā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);

}

程序中,無參宏P(guān)I-?旦定義,就可以在程序中用到 “3.14159” 的地方用PI來表示。

3.宏展開

編譯預(yù)處理時用宏代表的字符串替換宏名的過程,稱為宏展開,例如上述程序,宏展開后就成為:

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)于無參宏的使用說明

①宏定義不是C語言語句,不能在行尾加分號“;”,否則,宏展開時,會將分號作為字符串的一部分一起展開替換宏名。例如:

    #define PI 3.14159;

展開時就會成為如下形式:

    s=3.14159;*r*r;

②宏定義命令#define出現(xiàn)在函數(shù)的外部,宏名的有效范圍是:從定義命令之后到本文件結(jié)束。通常,宏定義命令放在文件開頭處。在程序中可以使用#undef命令終止宏定義的作用域,例如:

#include <stdio.h>

#define N 100

#define PI 3.14

main

{

  …

}

#undef N

void fun()

{

  …

}

    由于#undef的作用,使宏f\ffimain()函數(shù)結(jié)束時就終止,所以fun()函數(shù)出現(xiàn)N也不代表100,但PI的作用域從開始定義一直到文件結(jié)束。使用#undef可以靈活地控制宏的作用范圍。

③預(yù)處理器在用字符串替換程序中出現(xiàn)的宏時,只是簡單地替換,并不做語法檢查。例如,假設(shè)設(shè)計者手誤,將3.14159寫成了3.f4159:

    #define PI 3.f4159

程序在編譯時會出現(xiàn)“操作數(shù)無效”的錯誤。

5.無參宏的應(yīng)用

無參宏在實際中可以應(yīng)用到很多方面,主要有以下幾個方面:

(1)符號常量

如前面用到的PI、N都是符號常量的形式。

恰當(dāng)命名的符號常量能表達(dá)出宏所代表的字符串常量的實際含義,從而增強(qiáng)程序的可讀性。例如:

    #deflne EOF -1 /* 文件尾 */

    #define NULL 0 /* 空指針 */

(2)用宏定義表示數(shù)據(jù)類型

用宏定義表示一個數(shù)據(jù)類型,在程序中使用宏來定義數(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",這樣凡是在程序中需要用到這兩個格式字符的地方全部可以用F、D代替。

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

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