使用庫函式之前,應該用#include
引入對應的標頭檔案。這種以#
號開頭的命令稱為預處理命令。
c語言原始檔要經過編譯、鏈結才能生成可執行程式:
1) 編譯(compile)會將原始檔(.c
檔案)轉換為目標檔案。對於 vc/vs,目標檔案字尾為.obj
;對於gcc,目標檔案字尾為.o
。
編譯是針對單個原始檔的,一次編譯操作只能編譯乙個原始檔,如果程式中有多個原始檔,就需要多次編譯操作。2) 鏈結(link)是針對多個檔案的,它會將編譯生成的多個目標檔案以及系統中的庫、元件等合併成乙個可執行程式。
在實際開發中,有時候在編譯之前還需要對原始檔進行簡單的處理。例如,我們希望自己的程式在 windows 和 linux 下都能夠執行,那麼就要在 windows 下使用 vs 編譯一遍,然後在 linux 下使用 gcc 編譯一遍。但是現在有個問題,程式中要實現的某個功能在 vs 和 gcc 下使用的函式不同(假設 vs 下使用 a(),gcc 下使用 b()),vs 下的函式在 gcc 下不能編譯通過,gcc 下的函式在 vs 下也不能編譯通過,怎麼辦呢?
這就需要在編譯之前先對原始檔進行處理:如果檢測到是 vs,就保留 a() 刪除 b();如果檢測到是 gcc,就保留 b() 刪除 a()。
這些在編譯之前對原始檔進行簡單加工的過程,就稱為預處理(即預先處理、提前處理)。
預處理主要是處理以#
開頭的命令,例如#include
等。預處理命令要放在所有函式之外,而且一般都放在原始檔的前面。
預處理是c語言的乙個重要功能,由預處理程式完成。當對乙個原始檔進行編譯時,系統將自動呼叫預處理程式對源程式中的預處理部分作處理,處理完畢自動進入對源程式的編譯。
編譯器會將預處理的結果儲存到和原始檔同名的.i
檔案中,例如 main.c 的預處理結果在 main.i 中。和.c
一樣,.i
也是文字檔案,可以用編輯器開啟直接檢視內容。
c語言提供了多種預處理功能,如巨集定義、檔案包含、條件編譯等,合理地使用它們會使編寫的程式便於閱讀、修改、移植和除錯,也有利於模組化程式設計。
下面我們舉個例子來說明預處理命令的實際用途。假如現在要開發乙個c語言程式,讓它暫停 5 秒以後再輸出內容,並且要求跨平台,在 windows 和 linux 下都能執行,怎麼辦呢?
這個程式的難點在於,不同平台下的暫停函式和標頭檔案都不一樣:
不同的平台下必須呼叫不同的函式,並引入不同的標頭檔案,否則就會導致編譯錯誤,因為 windows 平台下沒有 sleep() 函式,也沒有 標頭檔案,反之亦然。這就要求我們在編譯之前,也就是預處理階段來解決這個問題。請看下面的**:
#include //不同的平台下引入不同的標頭檔案
#if _win32 //識別windows平台
#include #elif __linux__ //識別linux平台
#include #endif
int main()
#if、#elif、#endif 就是預處理命令,它們都是在編譯之前由預處理程式來執行的。這裡我們不討論細節,只從整體上來理解。
對於 windows 平台,預處理以後的**變成:
#include #include int main()
對於 linux 平台,預處理以後的**變成:
#include #include int main()
你看,在不同的平台下,編譯之前(預處理之後)的源**都是不一樣的。這就是預處理階段的工作,它把**當成普通文字,根據設定的條件進行一些簡單的文字替換,將替換以後的結果再交給編譯器處理。
php預處理 php預處理是什麼
可以把php預處理看作是想要執行的sql的一種編譯過的模板,它可以使用變數引數進行定製。php預處理的好處 1 查詢僅需解析 或預處理 一次,但可以用相同或不同的引數執行多次。當查詢準備好後,資料庫將分析 編譯和優化 執行該查詢的計畫。對於複雜的查詢,此過程要花費較長的時間,如果需要以不同引數多次重...
預處理命令
和 操作符是和 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 ...