預處理命令

2021-07-10 03:52:19 字數 2310 閱讀 4021

1. 以#開頭的預處理命令

預處理命令可以控制編譯器在進行編譯鏈結之前,對所寫的**進行一些其他的處理。

所謂的預處理就是在編譯之前對程式的處理,所以預處理命令也叫做預編譯命令。

「#」符號是預處理命令特有的符號,c語言中凡是出現「#」的地方一定是預處理命令。

編譯器通過「#」號來將我們寫的程式和預處理命令區分開的。

c語言的編譯器,主要完成兩個作用:

1)如果程式中有預處理命令,就根據預處理命令對程式做一些前期的處理,否則什麼都不做。

2)對經過預處理的程式進行編譯生成計算機可以識別的二進位制檔案。

生成可執行程式的過程如下圖:

2. 預處理命令的類別

c語言提供了三類預處理命令,指導編譯器來完成對程式不同層次上的修改,它們分別是:

1)巨集定義

#define 被替換的內容 替換為的內容

巨集定義主要分為不帶引數的巨集和帶引數的巨集:

主要來說一下帶引數的巨集:

#define add(x,y) x+y

在程式中,如果出現了add(...),就會發生巨集替換。

帶引數的巨集和函式的區別:

-------處理時間不同:巨集定義是在預處理階段進行的,而函式定義是在編譯階段實現的,函式呼叫是在函式執行時完成的。

-------處理方法不同:巨集定義是直接替換的,儘管替換有點複雜,本質上還是在進行符號替換。而函式呼叫是有引數傳遞和返回值過程的,不是簡單的符號替換。

-------符號型別不同:巨集定義是無資料型別的,僅僅只是符號;函式中的符號都是變數,是有型別的,如果型別不一致還會出現警告甚至錯誤。

注意: c語言中的巨集定義只認與巨集定義在一行的「替換內容」,如果想讓巨集定義多認幾行的內容,就在每一行的後面寫乙個反斜槓「\」,最後一行不需要。

反斜槓的作用就是告訴編譯器預處理命令還沒完,後面還有。

#define add(a,b,c,rst) rst=a+b;\

rst+=c;

2)預編譯控制

預編譯控制可以根據條件決定那一片**需要,哪一片**不需要,對**是一片一片處理的,需要的被留下,不需要的直接刪掉。

預處理命令的一般形式是:

#預編譯控制關鍵字 其他

c語言的預編譯控制的關鍵字有以下6個:

if   ifdef   ifndef   elif   else  endif

if:和if語句類似,後面的『其他』是乙個布林表示式,如果為真,執行後面的語句塊,否則不執行。

ifdef:如果定義了後面的『其他』,『其他』是乙個識別符號,如果是define命令定義的被替換的內容,執行後面的語句塊,否則不執行。

ifndef:如果沒有定義後面的識別符號,即其他沒有在define定義中出現過,則執行後面的語句塊,否則不執行。

else:類似於選擇結構中的else,如果前乙個if不成立,執行後面的語句塊,否則不執行。

endif:乙個預編譯控制結束的標誌,相當於是if選擇結構中的最後乙個右大括號。

3)標頭檔案包含

這個預處理命令可以告訴編譯器在預處理的時候,將乙個檔案的內容全部拷貝到另乙個檔案中。

放置公共**的檔案,被稱為標頭檔案,以後綴「.h」結尾的。

放置非公共**的檔案,被稱為原始檔,以後綴「.c」結尾的。

我們經常將一些常用的函式宣告,巨集定義,公共結構體型別、共用體型別和列舉型別,全域性變數等公共**都放在標頭檔案中。

而將一些非公共的函式定義、變數定義,型別定義等放在原始檔中。

一般將函式的宣告放在標頭檔案中,允許多處拷貝。而將函式的定義放在原始檔中,避免函式的多處定義錯誤。

#include 《標頭檔案》   --- 從庫檔案路徑搜尋標頭檔案

#include 」標頭檔案「     --- 從當前工作目錄搜尋標頭檔案

c語言提供的標準標頭檔案:

---- math.h 標頭檔案

這個標頭檔案提供了有關數**算的巨集,型別和函式。

如:計算乙個數的平方用pow(),以2為底的對數log()等等。

---- stdio.h  標頭檔案

提供有關輸入輸出的巨集,型別和函式。

---- stdlib.h 標頭檔案

提供一些輔助功能的函式,或者稱之為工具。

如:講乙個字串轉換成整型數子用atoi()函式,產生乙個隨機數用rand()函式,記憶體分配malloc()函式。

---- string.h  標頭檔案

提供字串操作的巨集、型別和函式。

字串拼接strcat(),字串比較strcmp(),字串拷貝strcpy()等等。

預處理命令

和 操作符是和 define 巨集使用的.使用 使在 後的首個引數返回為乙個帶引號的字串.例如,命令 define to string s s將會使編譯器把以下命令 cout to string hello world endl 理解為 cout hello world endl 使用 鏈結 前後的...

預處理命令

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

預處理命令

ansi c標準規定可以在c源程式中加入一些 預處理命令 來改進程式設計環境,提高程式設計效率。這些預處理指令都是由ansi c統一規定的,但是它並不是c語言本身的組成部分,不能直接對其進行編譯。c語言和其它高階程式語言的乙個重要區別就是可以使用預處理指令和它的預處理功能。預處理是指由預處理程式負責...