預處理:預處理命令是由ansi c統一規定的,但是它們不是c語言本身的組成部分,不能直接對它們進行編譯(因為編譯程式不能識別它們)。必須在對程式進行通常的編譯(包括詞法和語法分析、**生成、優化等)之前,先對程式中這些特殊的命令進行「預處理」,即根據預處理命令對程式作相應的處理(例如,若程式中用#define命令定義了乙個符號常量a,則在預處理時將程式中所有的a都置換為指定的字串。若程式中用#include命令包含乙個檔案「stdio.h」,則在預處理時將stdio.**件中的實際內容代替該命令)。經過預處理後的程式不再包括預處理命令了,最後再由編譯程式對預處理後的源程式進行通常的編譯處理,得到可供執行的目標**。c提供的預處理功能主要有:巨集定義、檔案包含、條件編譯,為了與一般c語句相區別,這些命令以符號「#」開頭。
1.巨集定義:
1.1不帶引數的巨集定義:用乙個指定的識別符號(即名字)來代表乙個字串,它的一般形式為:
#define 識別符號 字串
比如:#define pi 3.1415,它的作用是在本程式檔案中用指定的識別符號pi來代替3.1415這個字串,在編譯預處理時,將程式中在該命令以後出現的所有的pi都用3.1415代替,這個過程稱為「巨集展開」。#define是巨集定義命令。
巨集名一般用大寫字母表示,以便於變數名相區別
1.2帶引數的巨集定義
帶引數的巨集定義不是進行簡單的字串替換,還要進行引數替換,其定義形式一般為:
#define 巨集名(參數列) 字串。比如:#define s(a,b) a*b …… area=s(3,2)
2.「檔案包含」:指乙個原始檔可以將另外乙個原始檔的全部內容包含進,即將另外的檔案包含到本檔案之中。c語言提供了#include命令用來實現「檔案包含」的操作。其一般形式為:
#include「檔名」或#include《檔名》
在編譯時並不是對兩個檔案分別進行編譯,然後再將它們的目標程式連線的,而是在經過編譯預處理後將標頭檔案包含到主檔案中,得到乙個新的源程式,然後對這個檔案進行編譯,得到乙個目標檔案,被包含的檔案成為新的原始檔的一部分,而單獨生成目標檔案。
「標頭檔案」常以「.h」為字尾(head的縮寫)。當然不用「.h」為字尾,而用「.c」為字尾或者沒有字尾也是可以的,但用「.h」作字尾更能表示此檔案的性質。
如果需要修改程式中常用的一些引數,可以不必修改每個程式,只需把這些引數放在乙個標頭檔案中,在需要時修改標頭檔案即可。但是應當注意,被包含檔案修改後,凡包含此檔案的所有檔案都要全部重新編譯。
3.條件編譯:一般情況下,源程式中所有行都參加編譯。但是有時希望程式中一部分內容只在滿足一定條件時才進行編譯,也就是對這一部分內容指定編譯的條件,這就是「條件編譯」。有時,希望在滿足某條件時對某一組語句進行編譯,而當條件不滿足時則編譯另一組語句。條件編譯命令有以下幾種形式:
(1)#ifdef識別符號
程式段1
#else
程式段2
#endif
它的作用是若指定的識別符號已經被#define命令定義過,則在程式編譯階段編譯程式1;否則編譯程式2.其中else部分可以沒有。
(2)#ifndef 識別符號
程式段1
#else
程式段2
#endif
它的作用是若識別符號未被定義過則編譯程式段1;否則編譯程式段2
(3)#if 表示式
程式段1
#else
程式段2
#endif
它的作用是當指定的表示式值為真時就編譯程式段1;否則編譯程式段2
C語言基礎 預處理
預處理 1.c語言在對源程式進行編譯之前,會先對一些特殊的預處理指令作解釋 比如之前使用的 include檔案包含指令 產生乙個新的源程式 這個過程稱為編譯預處理 之後再進行通常的編譯 2.為了區分預處理指令和一般的c語句,所有預處理指令都以符號 開頭,並且結尾不用分號 3.預處理指令可以出現在程式...
C語言基礎 預處理指令
在編譯前進行解析處理的指令 源 編譯預處理 編譯 鏈結 執行 編譯預處理指令 1.巨集定義 define 1.1 不帶引數的巨集定義 1.2 帶引數的巨集定義 2.條件編譯 3.檔案包含 include 編譯預處理指令 1.所有的編譯預處理指令都是以 號開頭 2.所有的編譯預處理指令都不需要分號 巨...
C語言基礎(十) 預處理
預處理就是在編譯之前所做的事情,所以也叫預編譯,主要有巨集定義 檔案包含處理和條件編譯。巨集定義指令是指用乙個指定的識別符號代表乙個字串,可以減少程式中重複書寫某些字串的工作量,使用巨集可以達到 一改全改 的 規範。巨集定義主要分為不帶引數的巨集定義 和 帶引數的巨集定義。不帶引數的巨集定義 def...