在前面各章中,已多次使用過以「#」號開頭的預處理命令。
如包含命令#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()
(七)可用巨集定義表示資料型別,使書寫方便。
例如:區別:巨集定義只是簡單的字串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對型別說明符重新命名。被命名的識別符號具有型別定義說明的功能。#define integer int
#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函式的一般形式...