關於 define你知道多少?

2021-07-12 04:58:46 字數 1806 閱讀 8469

編譯乙個c/c++程式需要很多步驟,通常,我們第一步都是預處理階段,它的主要任務包括:刪除注釋,插入被include包含的檔案內容,定義和替換,以及確定**部分參與編譯的內容。

預定義符號是由預處理器定義的符號,它的值一般是字串常量或者是十進位制的數字常量

符        號

含       義

例       子

__file__

進行編譯的源檔名

"test.c"

__line__

檔案當前的行號

45__date__

檔案被編譯的日期

"june 25 2001"

__time__

檔案被編譯的時間

"18:09:33"

__stdc__

如果編譯器遵循ansi c其值為1其他值未定義

1eg:#define stuff 123

該語句表示,在以後的**中只要出現stuff預處理器就會自動將其替換成123

替換文字並不限於數字常量,形式可以多變,比如說:

#define do_foever for( ; ; )//定義乙個死迴圈

#define reg register/給register建立乙個簡短的名字來替換它(寫名字較長的關鍵字時比較方便)

#define case break;case//避免忘記寫break而出現的漏洞

如果你定義的巨集的值十分的長,可以使用換行符將它們寫在不同的幾行裡便於閱讀和理解。

*請不要再巨集的結尾加上; 如果你這樣做系統並不會報錯,但是有可能造成無法預知的後果

#define name(x,y) x+y

借用上例來說,定義巨集時引數列表的括號必須與name緊緊相鄰

巨集定義看起來十分的方便,但是有時它的結果卻和我們想要的結果相差甚遠

eg:define mul(x) x*x

當你printf("%d",mul(5+1))的時候結果卻並非36

因為在替換時,預處理器將巨集的內容完全替換之後才進行計算,上例中,預處理器將巨集的內容替換成

5+1*5+1 則計算結果是11

所以當你使用巨集定義的時候,不要吝嗇你的括號,避免出現這樣的錯誤

但是使用括號並非萬全之策,我們來看看下面這個例子

#define double(x) (x)+(x)

我們給x賦值為5 當你想要輸出10*double(5)時你會驚訝的發現結果並不是100 而是55

這是因為預處理器在替換時將它完全替換成10*(5)+(5)

所以在定義時我們應該更加細心將它定義成#define double(x) ((x)+(x))

#define替換的規則

首先檢查在你定義的巨集引數中是否包含了任何由#define定義的符號,如果有則先將它替換掉

替換文字被插入到程式中原來文字的位置。對於巨集,引數名則被他們的值替代

最後對結果文字掃面,看它是否包含任何被#defne定義的符號,如果有重複以上步驟

##表示連線 #表示不展開

巨集和函式的區別巨集函式

除了非常小的巨集之外,**的長度將大幅增長

函式**只出現在函式定義的地方,每次都呼叫同乙份**

除非準確的給巨集加上括號,否則可能由於運算子的優先順序產生不可預料的結果

函式呼叫之時只計算一次引數的值,求值結果便與運算

具有***的巨集產生不可預料的結果

引數只在被呼叫前求值一次然後傳給函式,不會產生任何特殊問題

巨集引數型別靈活,可以接受任何型別

嚴格規定引數型別,不靈活,更安全

執行速度更快

由於函式呼叫和返回的額外開銷會造成速度的降低

#undef移除乙個巨集定義

sizeof,你知道多少

今天去參加面試,筆試的第一道題就是這個sizeof的用法,考了六七個,平時覺得很熟,真拿來考到迷糊了。有必要再總結一下。題是這樣的 在32位作業系統環境下,請問以下sizeof的值各是多少。一 int p 10 sizeof p 這個就簡單,int型變數p佔4個位元組,答案就是4.二 char p ...

Java Enum,你知道多少?

引用的列舉型別 public enum state 遍歷 for state s state.values 可以使用switch 列舉變數把列舉值作為case條件。enumsetstateset enumset.allof state.class for state s stateset enumm...

LayoutParams 你知道多少?

從概念講起 layoutparams,顧名思義,就是布局引數。而且大多數人對此都是司空見慣,我們 xml 檔案裡面的每乙個 view 都會接觸到 layout 這樣的屬性,這實際上就是對布局引數的描述。大概大家也就清楚了,layout 這樣開頭的東西都不屬於 view,而是控制具體顯示在 layou...