預處理和 define

2021-09-01 13:10:04 字數 1466 閱讀 2068

目錄前言

預處理#define

巨集的優缺點

巨集的優點:

巨集的缺點:

既然要談預處理,那麼肯定得知道預處理是什麼?

程式語言的預處理的概念:在編譯之前進行的處理。 c語言的預處理主要有三個方面的內容:

巨集定義;

檔案包含;

條件編譯。

預處理命令以符號「#」開頭。預處理命令總是占用源**中的單獨一行,並且總是以 # 字元和預處理指令名稱開頭。# 字元的前面以及 # 字元與指令名稱之間可以出現空白符。

不跑題了,本文的重點是#define。#define是一條預處理命令,它的作用就是定義巨集。

巨集定義又稱為巨集代還、巨集替換,簡稱「巨集」。

《c陷阱與缺陷》也介紹了巨集:巨集並不是函式,巨集並不是語句,巨集並不是型別定義。

1.不帶引數的巨集

格式:

#define   巨集名   文字   //預處理時進行巨集展開,把巨集名替換成文字,這個文字可以是字串,**等。

#define n 3
把程式中所有的識別符號n替換成3。這種用法一般用在定義某個通常不改變的變數,如定義乙個二維陣列的行數和列數。

2.帶引數的巨集

格式:

#define   巨集名(引數列表)   文字

例如:

#define max(a,b) (((a)>(b))?(a):(b))  //定義乙個求兩數中大數的巨集

#define max(a,b) (((a)>(b))?(b):(a)) //定義乙個求兩數中小數的巨集

三元運算子要比if else語句更高效此處每個引數都帶括號的原因是防止實參如果是表示式的情況出錯:

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

#define sub2(a,b) (a)*(b)

int main()

我們預期的結果應該都是12,但是真實的結果卻不是,sub1輸出的是10,sub2輸出的是12。巨集只是簡單的文字替換,所以要小心使用,引數都用括號括起來是最好的做法。

提高執行效率

方便程式的修改

沒有型別檢查

不能除錯

邊界效應

#define dps struct s *   ..

.dps p1,p2;

經過編譯器拓展之後,變成:

struct s* p1,p2;

此時p1是我們所期望的s型別的指標,而p2就成了乙個s資料型別。

解決辦法:

#define dps struct (s*)

預處理define和defined

找不到出處是 了 ifdef 和 if defined 的區別在於,後者可以組成複雜的預編譯條件,比如 if defined aaa defined bbb endif if defined aaa version 12 endif 而 ifdef 就不能用上面的用法,也就是說,當你要判斷單個巨集是...

define和預處理指令

define和預處理指令 妖妖隨筆 預處理過程是先於編譯器對源 進行處理 進行初步的轉換 產生新的源 提供給編譯器。格式 預處理指令是以 開頭的 行,後是指令關鍵字,在關鍵字和 號之間允許存在任意個數的空白字元。空指令 沒有任何效果 include 引入乙個源 檔案 define 定義巨集 unde...

預處理指令define

1 用預處理指令 define 宣告乙個常數,用以表明1年中有多少秒 忽略閏年問題 define seconds per year 60 60 24 365 ul 我在這想看到幾件事情 define 語法的基本知識 例如 不能以分號結束,括號的使用,等等 懂得預處理器將為你計算常數表示式的值,因此,...