巨集定義的優缺點
當時沒答出來,只知道如果某個常量或者函式名很長的時候可以用巨集定義做替換,這樣的話程式也會比較美觀一點,可讀性也大大增強了。
其實在用vc程式設計的時候就會遇到很多巨集定義,尤其是類似「long,lpctstr」等等之類的,它們屬於微軟的自定義型別,但其本質上還是屬於c/c++裡面的那幾個標準型別。那用巨集定義到底有什麼好處呢?
先來看一下巨集的定義:用#define命令將乙個指定的識別符號(即巨集名)來代表乙個字串。它的一般型式為:
#define 表示符 字串
#define命令屬於「預處理命令」中的一種。它是由c++統一規定的,但非c++語言本身的組成部分,由於編譯器無法識別他們,不能對其直接進行編譯。預處理過程必須在對程式進行詞法與語義分析、**生成與優化等通常的編譯過程之前進行,經過預處理後的程式不再包含之前的預處理命令。
c++提供的預處理功能除了巨集定義之外,還有以下兩個:
1. 檔案包含(#include命令)
2. 條件編譯(#ifdef …. #def …. #endif命令)
#define命令還可以定義帶引數的巨集定義,用於實現某種特定的功能,其定義型式為:
#define 巨集名(引數列表) 字串
例如:#define sum(a,b) a+b
不過,由於c++增加了內聯函式(inline),實現起來比帶引數的巨集更方便,這樣的巨集在c++中已經很少使用了。
接下來看看巨集都有什麼好處:
1. 提高了程式的可讀性,同時也方便進行修改;
2. 提高程式的執行效率:使用帶參的巨集定義既可完成函式呼叫的功能,又能避免函式的出棧與入棧操作,減少系統開銷,提高執行效率;
3. 巨集是由預處理器處理的,通過字串操作可以完成很多編譯器無法實現的功能。比如##連線符。
但是它也有自己的缺點:
1.由於是直接嵌入的,所以**可能相對多一點;
2. 巢狀定義過多可能會影響程式的可讀性,而且很容易出錯;
3. 對帶參的巨集而言,由於是直接替換,並不會檢查引數是否合法,存在安全隱患。
補充:預編譯語句僅僅是簡單的值代替,缺乏型別的檢測機制。這樣預處理語句就不能享受c++嚴格的型別檢查的好處,從而可能成為引發一系列錯誤的隱患。
的確,巨集定義給我們帶來很多方便之處,但是必須正確使用,否則,可能會出現一些意想不到的問題。
最後,引用《c陷進與缺陷》的一句話,對其進行總結:
巨集並不是函式,巨集並不是語句,巨集並不是型別定義
**:巨集定義多條語句可以用如下的形式進行定義:
1#define swap(a,b) 2//
如果分行寫,可以寫成如下形式
3#define swap(a,b)
巨集定義一般分為帶參巨集定義和不帶參巨集定義。
帶參巨集定義,也即帶引數的巨集定義,如:
1#define max(a,b) ((a)>(b) ? (a) : (b)) //
求最大值
不帶參巨集定義,也即不帶引數的巨集定義,如:
1#define pi 3.14159 //
定義圓周率pi的值
巨集定義的優缺點
在用vc程式設計的時候就會遇到很多巨集定義,尤其是類似 long,lpctstr 等等之類的,它們屬於微軟的自定義型別,但其本質上還是屬於c c 裡面的那幾個標準型別。那用巨集定義到底有什麼好處呢?先來看一下巨集的定義 用 define命令將乙個指定的識別符號 即巨集名 來代表乙個字串。它的一般型式...
巨集定義的優缺點
公尺哈遊三面的乙個問題,問的很深,從巨集定義是什麼,幹什麼用,優缺點,到別的語言為什麼沒有,層層深入,很好的問題。結果我也很好的掛掉了。所以來討論一下上述幾個問題正確的答案到底是什麼。1.首先什麼是巨集定義,在c 中只有 define算是巨集定義,其餘的 操作都叫預處理,所以巨集定義就是 defin...
巨集定義的優缺點
今天中午360的面試官提的乙個問題 巨集定義的缺點。當時沒答出來,只知道如果某個常量或者函式名很長的時候可以用巨集定義做替換,這樣的話程式也會比較美觀一點,可讀性也大大增強了。其實在用vc程式設計的時候就會遇到很多巨集定義,尤其是類似 long,lpctstr 等等之類的,它們屬於微軟的自定義型別,...