例題:以下關於編譯預處理的敘述中錯誤的是( c )
a.預處理命令列必須以#開始
b.一條有效的預處理命令必須單獨佔據一行
c.預處理命令列只能位於源程式中所有語句之前
d.預處理命令不是c語言本身的組成部分
例題:c語言的編譯系統對巨集命令的處理是( d )
a.在程式執行時進行的
b.在程式連線時進行的
c.和c程式中的其他語句同時進行編譯的
d.在對源程式中其他成分正式編譯之前進行的
(一)預處理命令概述
凡是以「#」開頭的均為預處理命令。所謂預處理是指在進行編譯的第一遍掃瞄(詞法掃瞄和語法分析)之前所作的工作。預處理是c語言的乙個重要功能,它由預處理程式負責完成。當對乙個原始檔進行編譯時,系統將自動引用預處理程式對源程式中的預處理部分作處理,處理完畢自動進入對源程式的編譯。
預處理命令不是c語言本身的組成部分,不能直接對它們進行編譯(因為編譯程式不能識別它們)。必須在對程式進行通常的編譯(包括詞法和語法分析、**生成、優化等)之前,先對程式中這些特殊的命令進行「預處理」,即根據預處理命令對程式作相應的處理(例如,若程式中用#define命令定義的乙個符號常量a,則在預處理時將程式中所有的a都置換為指定的字串。若程式中用#include命令包含乙個檔案"stdio.h",則在預處理時將stdio.**件中的實際內容代替該命令)。經過預處理後的程式不再包括預處理命令了,最後再由編譯程式對預處理後的源程式進行通常的編譯處理,得到可供執行的目標**。現在使用的許多c編譯系統都包括了預處理、編譯和連線等部分,在進行編譯時一氣呵成。因此不少使用者誤認為預處理命令是c語言的一部分,甚至以為它們是c語句,這是不對的。
c語言提供了多種預處理功能,如檔案包含、巨集定義、條件編譯等。合理地使用預處理功能編寫的程式便於閱讀、修改、移植和除錯,也有利於模組化程式設計。
注意:預處理指令不是c語句,因此末尾沒有分號。
(二)檔案包含
c語言提供了#include檔案包含預處理命令,將乙個標頭檔案包含到源程式檔案中。
檔名可以帶路徑。
如果使用尖括號,則到系統指定包含目錄去查詢被包含檔案。如果使用雙引號,則首先在系統當前目錄下查詢被包含檔案,沒找到再到系統指定包含目錄去查詢。
一般使用尖括號包含系統定義的標頭檔案,使用雙引號包含使用者自定義的標頭檔案或源程式檔案。
(三)巨集定義
在c語言源程式中允許用乙個識別符號來表示乙個字串,稱為「巨集」。被定義為「巨集」的識別符號稱為「巨集名」。在編譯預處理時,對程式中所有出現的「巨集名」,都用巨集定義中的字串去代換,這稱為「巨集代換」或「巨集展開」。
在c語言中,「巨集」分為有引數和無引數兩種。
(1)無參巨集定義
一般形式為:#define 識別符號 字串
(2)帶參巨集定義
巨集定義的一般形式為:#define 巨集名(形參表) 字串
帶參巨集呼叫的一般形式為:巨集名(實參表);
c語言允許巨集帶有引數。在巨集定義中的引數稱為形式引數,在巨集呼叫中的引數稱為實際引數。對帶引數的巨集,在呼叫中,不僅要巨集展開,而且要用實參去代換形參。
例如:#define m(y) yy+3y /巨集定義/
…k = m(5); /巨集呼叫/
(四)條件編譯
預處理程式提供了條件編譯的功能。可以按不同的條件去編譯不同的程式部分,因而產生不同的目標**檔案。這對於程式的移植和呼叫是很有用的。
條件編譯允許只編譯源程式中滿足條件的程式段,使生成的目標程式較短,從而減少了記憶體的開銷並提高了程式的效率。
條件編譯有三種形式:
1)第一種形式
#ifdef 識別符號
程式段1
#else
程式段2
#endif
它的功能是,如果識別符號已被#define命令定義過則對程式段進行編譯;否則對程式段2進行編譯。
如果沒有程式段2(它為空),本格式中的#else可以沒有,即可以寫成:
#ifdef 識別符號
程式段#endif
在程式的第一行巨集定義中,定義num表示字串ok
#define num ok
其實也可以為任何字串,甚至不給出任何字串,寫為:
#define num
也具有同樣的意義。
2)第二種形式
#ifndef 識別符號
程式段1
#else
程式段2
#endif
與第一重形式的區別是將「ifdef」改為「ifndef」。它的功能是,如果識別符號未被#define命令定義過則對程式段1進行編譯,否則對程式段2進行編譯。這與第一種形式的功能正相反。
3)第三種形式
#if 常量表示式
程式段1
#else
程式段2
#endif
它的功能是,如果常量表示式的值為真(非0),則對程式段1進行編譯,否則對程式段2進行編譯。 預處理命令
和 操作符是和 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語言和其它高階程式語言的乙個重要區別就是可以使用預處理指令和它的預處理功能。預處理是指由預處理程式負責...