C語言預處理命令

2021-07-26 14:47:16 字數 3291 閱讀 3753

以「#」開頭的預處理命令。如#include,巨集定義命令#define pi 3.1415926等。

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

無參巨集定義:

無參巨集的巨集名後不帶引數。其定義的一般形式為: #define 識別符號 字串

其中的「#」表示這是一條預處理命令,凡是以「#」開頭的均為預處理命令。

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

例如:#define pi 3.1415926

它的作用是指定識別符號pi來代替數3.1415926。對源程式作編譯時,將先由預處理程式進行巨集代換,即用3.1415926表示式去置換所有的巨集名pi,然後再進行編譯。

例如:計算圓的面積。。

#include#define pi 3.1415926

int main()

對於巨集定義的說明:

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

2、行末不加分號,如果加上分號就連分號一起置換。

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

4、巨集名在源程式中若用引號括起來,則預處理程式不對其進行巨集代換。

可以試驗一下這個**:

#include#define pi 3.1415926

void fun(void);

int main()

void fun(void)

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

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

例如:

#include#define pi 3.1415926

#define s pi*r*r

int main()

7、可以用巨集定義表示資料型別,使書寫方便。例如:#define integer int

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

例如:

#include #define p printf

#define d "%d\n"

#define f "%.2lf\n"

int main()

巨集定義表示資料型別和用typedef定義資料說明符的區別:

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

試一下這個**:

#include #define pin1 char*

typedef char* pin2;

int main()

帶參巨集定義:

c語言允許巨集帶有引數。在巨集定義中的引數稱為形式引數,在巨集呼叫的引數稱為實際引數。

對帶引數的巨集,在呼叫中,不僅要巨集展開,而且要用實參去代換形參。

帶參巨集定義的一般形式為:#define 巨集名(形參表) 字串

#define m(y) y*y+3*y   //巨集定義

k=m(y);                  //巨集呼叫,經過預處理之後,相當於k=y*y+3*y,而y=5。

.......

例如:

#include #define max(a,b) (a>b)?a:b

int main()

注意:

1、帶參巨集定義中,巨集名和形參表之間沒有空格。

2、在帶參巨集定義中,形參不分配記憶體單元,因此不用作型別定義。而巨集呼叫中的實參有具體的值。要用它們去代換形參,因此必須做型別說明。這是與函式中的情況不同的。在函式中,形參和實參是兩個不同的量,各有自己的作用域,呼叫時要把實參值賦予形參,進行「值傳遞」。而在帶參巨集中,只是符號代換,不存在值傳遞的問題。

3、在巨集定義中的形參是識別符號,而巨集呼叫中的實參可以是表示式。

4、在巨集定義中,字串內的形參通常要用括號括起來避免出錯。寫程式的時候要注意運算順序。

例如:

#include #define  sq(y) (y)*(y)

int main()

5、帶參的巨集和帶參函式的不同:把同一表示式用函式處理與用巨集定義處理兩者結果有可能是不同的。

比較一下下面兩個**:

#includeint main()

}int sq(int y)

#include #define  sq(y) ((y)*(y))

int main()

}

6、巨集定義也可以用來定義多個語句,在巨集呼叫時,把這些語句又代換到源程式內。

例如:

#include #include#define  str(s1,s2,s3,sum) strcat(strcat(strcat(sum,s1),s2),s3)

int main()

檔案包含:

1、乙個iinclude命令只能指定乙個被包含檔案,若有多個檔案要包含,則需要多個include命令。

2、檔案包含允許巢狀,即在乙個被包含的檔案中又可以包含另乙個檔案。

條件編譯:

第一種形式:

#ifdef 識別符號

程式段1

#else

程式段2

#endif

它的功能是,如果識別符號已被#define命令定義過則對程式段1進行編譯;否則對程式段2進行編譯。

如果沒有程式段2,可以寫為:

#ifdef 識別符號

程式段#endif

第二種形式:

#ifndef 識別符號

程式段1

#else

程式段2

#endif

第三種形式:

#if 常量表示式

程式段1

#else

程式段2

#endif

C語言 預處理命令

我們可以在c源程式中插入傳給編譯程式的各中指令,這些指令被稱為預處理器指令,它們擴充了程式設計的環境。現把常用的預處理命令總結如下 1.預處理程式 按照ansi標準的定義,預處理程式應該處理以下指令 if ifdef ifndef else elif endif define undef line ...

C語言 預處理命令

一 巨集定義 在 語言源程式中允許用乙個識別符號來表示乙個字串,稱為 巨集 被定義為 巨集 的識別符號稱為 巨集名 在編譯預處理時,對程式中所有出現的 巨集名 都用巨集定義中的字串去代換,這稱為 巨集代換 或 巨集展開 巨集定義是由源程式中的巨集定義命令完成的。巨集代換是由預處理程式自動完成的。在 ...

C語言預處理命令

我們經常使用 include命令。使用庫函式之前,應該用 include引入對應的標頭檔案。這種以 號開頭的命令稱為預處理命令。1 編譯 compile 會將原始檔 c檔案 轉換為目標檔案。對於 vc vs,目標檔案字尾為.obj 對於gcc,目標檔案字尾為.o。編譯是針對單個原始檔的,一次編譯操作...