1. 程式人生 > >預處理-01-無參宏定義

預處理-01-無參宏定義

命名 而且 標識符 源文件 aps 習慣 書寫 define ESS

在之前,已多次使用過以“#”號開頭的預處理命令。

如包含命令#include <stdio.h>,宏定義命令#define PI 3.1415926等。

在源程序中這些命令都放在函數之外,而且一般都放在源文件的前面,它們稱為預處理部分。

1.無參宏定義
  無參宏的宏名後不帶參數。其定義的一般形式為: #define 標識符 字符串
  其中的“#”表示這是一條預處理命令。凡是以“#”開頭的均為預處理命令。define 為宏定義命令。“標識符”為所定義的宏名。“字符串”可以是常數、表達式、格式串等。
  例如: #define PI 3.1415926,它的作用是指定標識符PI來代替數3.1415926。
  在編寫源程序時,所有的3.1415926都可由PI代替,而對源程序作編譯時,將先由預處理程序進行宏代換,即用3.1415926表達式去置換所有的宏名PI,然後再進行編譯。

2.對於宏定義還要說明以下幾點:

(一)宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的代換,字符串中可以含任何字符,可以是常數,也可以是表達式,預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開後的源程序時發現。

(二)宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。

(三)宏定義必須寫在函數之外,其作用域為宏定義命令起到源程序結束。如要終止其作用域可使用# undef命令。

(四)宏名在源程序中若用引號括起來,則預處理程序不對其作宏代換

  實例如下:

技術分享圖片
#include <stdio.h>

#define PI 3.1415926

void
fun(void); void main() { double s; int r; printf("Please enter the radius : "); scanf("%d", &r); s = PI * r * r; printf("\n\nThe area of the roundness = %g\n\n", s); fun(); } void fun(void) { printf("Now the PI = %g\n\n", PI); printf(
"PI\n\n"); // PI在引號中應該是表示常量字符串,不替換…… }
View Code

(五)宏定義允許嵌套,在宏定義的字符串中可以使用已經定義的宏名。在宏展開時由預處理程序層層代換。

  實例如下:

技術分享圖片
#include <stdio.h>

#define PI 3.1415926
#define S PI*r*r

void fun(void);

void main()
{     
      double s;
      int r;

      printf("Please enter the radius : ");
      scanf("%d", &r);

      s = S;

      printf("\n\nThe area of the roundness = %g\n\n", s);      

}
View Code

(六)習慣上宏名用大寫字母表示,以便於與變量區別。但也允許用小寫字母。

(七)可用宏定義表示數據類型,使書寫方便。
  例如:#define INTEGER int

  註意:宏定義表示數據類型和用typedef定義數據說明符的區別
  區別:宏定義只是簡單的字符串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對類型說明符重新命名。被命名的標識符具有類型定義說明的功能。

  請看示例:

技術分享圖片
#include <stdio.h>

#define PIN1 char*//#define末尾不加分號
typedef char* PIN2;//typedef末尾加分號

void main()
{
      PIN1  x, y;//等價於char *x,y;
      PIN2  a, b;//等價於char *a,*b;

      printf("By #define : %d  %d\n\n", sizeof(x), sizeof(y));
      printf("By typedef : %d  %d\n\n", sizeof(a), sizeof(b));
}
View Code

(八)對“輸出格式”作宏定義,可以減少書寫麻煩。請看示例:

技術分享圖片
#include <stdio.h>

#define P printf
#define D "%d\n"
#define F "%f\n"

void main()
{
      int a = 5, c = 8, e = 11;
      float b = 3.8, d = 9.7, f = 21.08;
      
      P(D F, a, b);
      P(D F, c, d);
      P(D F, e, f);
      
}
View Code

預處理-01-無參宏定義