偶爾翻c++的教材,看到了一些以前自己不太關注的角落。
參考教材《c++大學教程》 harvey m.deitel 和paul james deitel著。
預處理發生在編譯之前,包括把其他檔案包含到要編譯的檔案中、定義符號常量和巨集、程式**的條件編譯以及預處理指令的條件執行。對應的,預處理指令有:檔案包含命令,巨集命令,條件編譯命令等。
所有的預處理指令均以#開頭。
預處理指令不是c++語句,所以不能用分號(;)結尾。
1.#include (檔案包含)
用指定檔案的乙份副本取代這條預處理指令。有兩種形式:
#include
// 從預設的系統目錄中查詢要包含的檔案(標頭檔案)。通常用來包含標準庫的標頭檔案,
#include"***xx"
// 從正在編譯的程式所在的目錄中查詢要包含的檔案(標頭檔案),如果找不到,則再按照第一種方式查詢。該形式通常用來包含程式設計師定義的標頭檔案。
說明: 檔案包含是可以巢狀的。標頭檔案中可以包含另乙個標頭檔案。
2 #define (巨集定義)
什麼是「巨集」?英文中叫「macro」。其實這不是乙個標準的英文單詞,而是乙個單詞的字首,參見牛津高階詞典:
「macro-
comb form
構詞成分 large; large-scale 大的;大規模的:macrobiotic * macroeconomic(s)
. cf 參看 micro-
, mini
-.「
可見,它是與micro,mini相對應的。在計算機學科裡,我們經常見到」巨集「。大致意思就是」根據一系列預定義的規則替換一定的文字模式。「 (吐槽一下,現在行業術語太多,加上不同語言之間互相亂翻譯,導致我們很多時候會望文生義無法理解真正的意思。因此,很多高手都建議直接從原文讀,直接從大部頭經典書籍讀起。這是以大量的時間和精力為代價的呀~)
在c++中,「巨集」包含兩種:不帶引數的巨集和帶引數的巨集。
2.1 不帶引數的巨集(用於建立符號常量)
格式: #define 識別符號(巨集名) 替換文字(字串或數值)
#define pi 3.1415926 // 舉例 , 用 pi來代替 3.1415926
說明:a.巨集名一般用大寫字母表示,取有意義的名字可提高可讀性。
b.巨集替換不進行型別安全性檢查,因此有隱患。所以,現在一般建議用const來代替巨集。本例中const double pi=3.1415926
c.巨集的作用域是從其定義開始到源程式檔案結束。巨集定義可出現在源程式任意位置。
d.可用#undef命令終止巨集名的作用域。格式為#undef 巨集名
e.有本書上說」對程式中用雙引號括起的」巨集名「不進行替換「,很神奇,沒用過,也不知道這樣有什麼用!
不帶引數的巨集就寫這麼多。它的好處嘛,就是修改起來方便,只要改乙個地方就行了。不用去源程式裡挨個找。
2.2 帶引數的巨集(用符號定義操作(operation))
這類巨集,在c++中,已經換成了模板和內聯函式。
格式:#define 巨集名(參數列) 字串
#define square(x) ((x)*(x)) //舉例,用法square(4)即為((4)×(4))
注意:a.括號要多加。因為它這裡只是文字替換,如果不加括號,可能會引起計算錯誤。具體不解釋了。
b.可用#undef命令終止巨集名的作用域。格式為#undef 巨集名
c.一行如果不夠寫,加」\「,然後到下一行繼續寫。(很少用到吧)
d.巨集名和括號之間不能有空格!否則會將括號後面的部分全部認為替換。
3.條件編譯
#if #else #elif #endif #ifdef #ifndef
這裡咱們最常見的是在head檔案的最前面:
#ifndef ***_h
#define ***_h
...#endif
這裡的意思是,如果沒有定義 ***_h, 則定義***_h。然後編譯後面的內容(到#endif截止)。
按照前面的#define語句,應該是給***_h後面接乙個替換文字。
但此處卻沒有。這到底什麼意思呢?我網上搜了半天,發現,似乎是把它替換成0了。(沒驗證)。不管它替換成什麼吧,
此處的實際意義是避免標頭檔案被重複included。
「標識的命名規則一般是
頭檔名全大寫,前面加下劃線,並把檔名中的「.」也變成下劃線,如:
stdio.h
#ifndef _stdio_h
#define _stdio_h
當然,這裡只是建議一般這樣寫。因為我們看到的很多源**都是這樣的嘛。規範一點總是有好處。
就這些吧。以後遇到再繼續學習。
C 預處理器
預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。所有的預處理器指令都是以井號 開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c 語句,所以它們不會以分號 結尾。我們已經看到,之前所有的例項中都有 include指令。這個巨集用於把頭檔案包含到原始檔中。c 還支援很多預處理...
C 預處理器
預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。所有的預處理器指令都是以井號 開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c 語句,所以它們不會以分號 結尾。我們已經看到,之前所有的例項中都有 include指令。這個巨集用於把頭檔案包含到原始檔中。c 還支援很多預處理...
C 預處理器
預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。所有的預處理器指令都是以井號 開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c 語句,所以它們不會以分號 結尾。我們已經看到,之前所有的例項中都有 include指令。這個巨集用於把頭檔案包含到原始檔中。c 還支援很多預處理...