C語言的預處理

2021-09-11 19:19:40 字數 2280 閱讀 6069

在編譯之前進行的處理。 c語言的預處主要有三個方面的內容:1.巨集定義; 2.檔案包含; 3.條件編譯。 預處理命令以符號「#」開頭。

巨集定義又稱為巨集代換、巨集替換,簡稱「巨集」。

格式:#define識別符號文字

其中的識別符號就是所謂的符號常量,也稱為「巨集名」。

預處理(預編譯)工作也叫做巨集展開:將巨集名替換為文字(這個文字可以是字串、可以是**等)。

掌握"巨集"概念的關鍵是「換」。一切以換為前提、做任何事情之前先要換,準確理解之前就要「換」。

即在對相關命令或語句的含義和功能作具體分析之前就要換:

例:#define pi 3.1415926

把程式中全部的識別符號pi換成3.1415926

說明:

(1)巨集名一般用大寫

(2)使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:陣列大小常用巨集定義

(3)可以用#undef命令終止巨集定義的作用域

(4)巨集定義可以巢狀

2.帶引數的巨集:

除了一般的字串替換,還要做引數代換

格式:#define 巨集名(參數列)文字

例如:#define s(a,b) ab

area=s(3,2);第一步被換為area=ab; ,第二步被換為area=3*2;

類似於函式呼叫,有乙個啞實結合的過程:

(1)實參如果是表示式容易出問題

#define s® rr

area=s(a+b);第一步換為area=rr;,第二步被換為area=a+ba+b;

正確的巨集定義是#define s® (®®)

(2)巨集名和引數的括號間不能有空格

(3)巨集替換只作替換,不做計算,不做表示式求解

(4)函式呼叫在編譯後程式執行時進行,並且分配記憶體。巨集替換在編譯前進行,不分配記憶體

(5)巨集的啞實結合==不存在型別,也沒有型別轉換。

(6)巨集展開使源程式變長,函式呼叫不會

(7)巨集展開不佔執行時間,只佔編譯時間,函式呼叫佔執行時間(分配記憶體、保留現場、值傳遞、返回值)

乙個檔案包含另乙個檔案的內容

格式:#include 「檔名」

或#include 《檔名》

編譯時以包含處理以後的檔案為編譯單位,被包含的檔案是原始檔的一部分。

編譯以後只得到乙個目標檔案.obj

被包含的檔案又被稱為「標題檔案」或「頭部檔案」、「標頭檔案」,並且常用.h作副檔名。

修改標頭檔案後所有包含該檔案的檔案都要重新編譯

標頭檔案的內容除了函式原型和巨集定義外,還可以有結構體定義,全域性變數定義

(1)乙個#include命令指定乙個標頭檔案;

(2)檔案1包含檔案2,檔案2用到檔案3,則檔案3的包含命令#include應放在檔案1的頭部第一行;

(3)包含可以巢狀;

(4)《檔名》稱為標準方式,系統到頭檔案目錄查詢檔案,

"檔名"則先在當前目錄查詢,而後到頭檔案目錄查詢;

(5)被包含檔案中的靜態全域性變數不用在包含檔案中宣告。

有些語句希望在條件滿足時才編譯。

格式:(1)

#ifdef 識別符號

程式段1

#else

程式段2

#endif

或#ifdef

程式段1

#endif

當識別符號已經定義時,程式段1才參加編譯。

格式:(2)

#ifndef 識別符號

#define 標識1

程式段1

#endif

如果識別符號沒有被定義,則重定義標識1,且執行程式段1。

格式:(3)

#if 表示式1

程式段1

#elif 表示式2

程式段2

……#elif 表示式n

程式段n

#else

程式段n+1

#endif

當表示式1成立時,編譯程式段1,當不成立時,編譯程式段2。

注:⚠️

使用條件編譯可以使目標程式變小,執行時間變短。

預編譯使問題或演算法的解決方案增多,有助於我們選擇合適的解決方案。

此外,還有布局控制:#pragma,這也是我們應用預處理的乙個重要方面,主要功能是為編譯程式提供非常規的控制流資訊。

C語言預處理

c語言中編譯預處理的三種形式的命令 巨集定義,檔案包含,條件編譯命令。1 巨集定義主要是 define,undef 如下 define pi 3.1415926 不帶引數的巨集定義 define max a,b a b?a b 帶引數的巨集定義 說明 巨集定義在c語言與c 語言中是相通的。下面舉例說...

C語言預處理

預處理 系統自動自動呼叫預處理程式對程式中 號開頭的預處理部分進行處理,處理完畢後可以進城源程式的編譯階段。預定義 一些預定義符號 常用於除錯 file 正在預編譯的源檔名 line 當前行號 只有這個是整數常量,其他是字串常量 function 當前所在函式名 date 當前日期 time 當前時...

c語言預處理

預處理可以包含 1 巨集定義指令 2 標頭檔案包括指令 3 條件編譯指令 4 編譯程式可以識別的特殊符號 巨集定義 define undef 檔案包含 include 條件編譯 if ifdef else elif endif等 其他 line error program等 注意事項 1 在c語言中...