C 預處理器

2021-06-22 11:18:42 字數 2369 閱讀 2792

偶爾翻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 還支援很多預處理...