11預處理命令下

2022-05-15 18:33:10 字數 1905 閱讀 8949

乙個巨集定義只能佔一行**,這可不是你所認為的一行**,而是編譯器所認為的一行**

正如上圖所示,巨集定義以 #define 作為語句的開頭,之後兩部分,用空格分隔,在預處理階段期間,會把**中的 a 內容替換成 b 內容,以此來最終生成「待編譯原始碼」。

巨集定義關鍵字、原內容和替換內容 三者必須寫到一行。

可以看到,我們定義了乙個支援兩個引數的巨集,名字為 mul,替換的內容為 a * b。注意,替換內容中的 a 是巨集引數中的 a,b 也是巨集引數中的 b。這裡我再強調一下,理解巨集的工作過程,始終離不開那句話:巨集做的就是簡單替換。

#include #define mul(a, b) a * b

int main()

「待編譯原始碼」決定了最終程式的功能。

巨集做的就是簡單的替換。

巨集在預處理階段將被展開,變成「待編譯原始碼」中的內容,並且做的僅僅是簡單的替換。也就是說,mul(a, b) 這個巨集,替換的形式是 a * b;而 mul(3 + 4, 5) 中 3 + 4 是引數 a 的內容,5 是 b 的內容,依次替換為 a*b 式中的 a,b 的話,最終得到的替換內容應該是 「3 + 4 * 5」,這個才是「待編譯原始碼」中真正的內容。面對這個替換以後的表示式,你就知道為什麼輸出的結果是 23,而不是 35 了吧。

mul 的使用形式雖然和函式類似,可實際執行原理和函式完全不一樣

c 語言給我們提供了一種在行尾加 \(反斜槓)的語法,以此來告訴編譯器,本行和下一行其實是同一行內容。這樣就做到了:人在閱讀**的時候,看到的是兩行**,而編譯器在解析的時候,會認為是一行**,也就解決了複雜的巨集定義的可讀性的問題。

#include #define swap(a, b) 

int main()

需要特別注意的是,**中反斜槓的後面,不能出現任何其他內容。

條件編譯,就是預處理階段的條件分支語句,其主要作用是根據條件,決定「源**」中的哪些**,接下來會被預處理繼續進行處理。

請你完善下面**中的 max 巨集,max 巨集的作用,就是接受兩個元素,選擇出兩個元素中的最大值。完善以後的 max 巨集,輸出需要與如下給出的輸出樣例一致,注意,只能修改 max 巨集的定義內容,不可以修改主函式中的內容。

#define log(frm, args...)
如上**所示,在最後乙個引數後面,加上三個點,就代表,這個巨集除了第乙個 frm 引數以外,後面接收的引數個數是可變的,那麼後面的引數內容,統一存放在引數 args 中。

#define log(frm, args...) printf(frm, args)
編譯器會預設一些巨集,這些巨集會為我們提供很多與**相關的有用資訊

可移植性==你寫了乙份**,當你的執行環境發生改變時,你的**到底要不要做修改?如果要做修改,到底要做多少修改?

巨集定義只占用一行**,為了增強巨集定義的**可讀性,我們可以採用在行尾加反斜槓的技巧,來使得上下兩行**,變成編譯器眼中的一行**。

巨集的作用,就是替換,要想理解最終的**行為,必須從巨集替換以後的**入手分析。

條件編譯相當於一種預處理階段的**剪裁技巧。

編譯器預設的巨集,有標準的,也有非標準的,非標準的**會影響其可移植性。

預處理命令

和 操作符是和 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語言和其它高階程式語言的乙個重要區別就是可以使用預處理指令和它的預處理功能。預處理是指由預處理程式負責...