我們經常使用#include命令。使用庫函式之前,應該用#include引入對應的標頭檔案。這種以#號開頭的命令稱為預處理命令。
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語言的乙個重要功能,由預處理程式完成。當對乙個原始檔進行編譯時,系統將自動呼叫預處理程式對源程式中的預處理部分作處理,處理完畢自動進入對源程式的編譯。
我們舉例來說明預處理命令的實際用途。假如現在要開發乙個c語言程式,讓它暫停 5 秒以後再輸出內容,並且要求跨平台,在 windows 和 linux 下都能執行,怎麼辦呢?
這個程式的難點在於,不同平台下的暫停函式和標頭檔案都不一樣:
windows 平台下的暫停函式的原型是void sleep(dword dwmilliseconds)(注意 s 是大寫的),引數的單位是「毫秒」,位於 標頭檔案。
linux 平台下暫停函式的原型是unsigned int sleep (unsigned int seconds),引數的單位是「秒」,位於 標頭檔案。
不同的平台下必須呼叫不同的函式,並引入不同的標頭檔案,否則就會導致編譯錯誤,因為 windows 平台下沒有 sleep() 函式,也沒有 標頭檔案,反之亦然。這就要求我們在編譯之前,也就是預處理階段來解決這個問題。
示例
#include
//不同的平台下引入不同的標頭檔案
#if _win32
//識別windows平台
#include
#elif __linux__
//識別linux平台
#include
#endif
intmain()
#if、#elif、#endif 就是預處理命令,它們都是在編譯之前由預處理程式來執行的。
對於 windows 平台,預處理以後的**變成:
#include
#include
intmain()
對於 linux 平台,預處理以後的**變成:
#include
#include
intmain()
如上所示,在不同的平台下,編譯之前(預處理之後)的源**都是不一樣的。這就是預處理階段的工作,它把**當成普通文字,根據設定的條件進行一些簡單的文字替換,將替換以後的結果再交給編譯器處理。
如果感覺不錯的話請點贊喲!!!
C語言 預處理命令
我們可以在c源程式中插入傳給編譯程式的各中指令,這些指令被稱為預處理器指令,它們擴充了程式設計的環境。現把常用的預處理命令總結如下 1.預處理程式 按照ansi標準的定義,預處理程式應該處理以下指令 if ifdef ifndef else elif endif define undef line ...
C語言 預處理命令
一 巨集定義 在 語言源程式中允許用乙個識別符號來表示乙個字串,稱為 巨集 被定義為 巨集 的識別符號稱為 巨集名 在編譯預處理時,對程式中所有出現的 巨集名 都用巨集定義中的字串去代換,這稱為 巨集代換 或 巨集展開 巨集定義是由源程式中的巨集定義命令完成的。巨集代換是由預處理程式自動完成的。在 ...
C語言預處理命令
以 開頭的預處理命令。如 include,巨集定義命令 define pi 3.1415926等。在源程式中這些命令都放在函式之外,而且一般放在原始檔前面,它們稱為預處理部分。無參巨集定義 無參巨集的巨集名後不帶引數。其定義的一般形式為 define 識別符號 字串 其中的 表示這是一條預處理命令,...