零基礎入門學習C語言010講 預處理(1)

2021-09-20 13:09:21 字數 1973 閱讀 3068

在前面各章中,已多次使用過以「#」號開頭的預處理命令。

如包含命令#include ,巨集定義命令#define pi 3.1415926等。

在源程式中這些命令都放在函式之外,而且一般都放在原始檔的前面,它們稱為預處理部分。

無參巨集的巨集名後不帶引數。

其定義的一般形式為:

#define  識別符號  字串

其中的「#」表示這是一條預處理命令。

凡是以「#」開頭的均為預處理命令。

define 為巨集定義命令。「識別符號」為所定義的巨集名。「字串」可以是常數、表示式、格式串等。

例如:

#define pi 3.1415926

它的作用是指定識別符號pi來代替數

3.1415926。

在編寫源程式時,所有的3.1415926都可由pi代替,而對源程式作編譯時,將先由預處理程式進行巨集代換,即用3.1415926表示式去置換所有的巨集名pi,然後再進行編譯。

#include #define pi 3.1415926

void main()

(一)巨集定義是用巨集名來表示乙個字串,在巨集展開時又以該字串取代巨集名,

這只是一種簡單的代換,字串中可以含任何字元,可以是常數,也可以是表示式,預處理程式對它不作任何檢查。如有錯誤,只能在編譯已被巨集展開後的源程式時發現。

(二)巨集定義不是說明或語句,

在行末不必加分號,如加上分號則連分號也一起置換。

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

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

#include #define pi 3.1415926

void fun(void);

void main()

void fun(void)

(五)巨集定義允許巢狀,在巨集定義的字串中可以使用已經定義的巨集名。在巨集展開時由預處理程式層層代換。

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

#include #define pi 3.1415926

#define s pi*r*r

void fun(void);

void main()

(七)可用巨集定義表示資料型別,使書寫方便。

例如:

#define integer int

區別:巨集定義只是簡單的字串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對型別說明符重新命名。被命名的識別符號具有型別定義說明的功能。

#include #define pin1 char*

typedef char* pin2;

void main()

在上面的例子中,

對於 pin1 x,y;就是簡單替換為 char *x, y;

對於 pin2 x,y;才是編譯為為 char *x, *y;

(八)對「輸出格式」作巨集定義,可以減少書寫麻煩。

#include #define p printf

#define d "%d\n"

#define f "%f\n"

void main()

思考題:不用迴圈和遞迴,列印數字0~999.

#include "stdio.h"

#define a(x) x;x;x;x;x;x;x;x;x;x

int main(void)

零基礎入門學習C語言010講 預處理(2)

語言允許巨集帶有引數。在巨集定義中的引數稱為形式引數,在巨集呼叫中的引數稱為實際引數。對帶引數的巨集,在呼叫中,不僅要巨集展開,而且要用實參去代換形參。帶參巨集定義的一般形式為 define 巨集名 形參表 字串 帶參巨集呼叫的一般形式為 巨集名 實參表 例如 define m y y y 3 y ...

零基礎入門學習C語言010講 預處理(3)

儘管我們很熟悉,但對檔案包含命令還要說明以下幾點 1.乙個include命令只能指定乙個被包含檔案,若有多個檔案要包含,則需用多個include命令。2.檔案包含允許巢狀,即在乙個被包含的檔案中又可以包含另乙個檔案。3.包含命令中的檔名可以用雙引號括起來,也可以用尖括號括起來。例如以下寫法都是允許的...

零基礎入門學習C語言004講 順序程式設計(2)

scanf函式稱為格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。1.scanf函式的一般形式 scanf函式是乙個標準庫函式,它的函式原型在標頭檔案 stdio.h 中,與printf函式相同,語言也允許在使用scanf函式之前不必包含stdio.件。scanf函式的一般形式...