巨集定義的優缺點

2022-09-12 06:15:09 字數 1310 閱讀 6972

今天中午360的面試官提的乙個問題:巨集定義的缺點。

當時沒答出來,只知道如果某個常量或者函式名很長的時候可以用巨集定義做替換,這樣的話程式也會比較美觀一點,可讀性也大大增強了。

其實在用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陷進與缺陷》的一句話,對其進行總結:

巨集並不是函式,巨集並不是語句,巨集並不是型別定義

巨集定義的優缺點

在用vc程式設計的時候就會遇到很多巨集定義,尤其是類似 long,lpctstr 等等之類的,它們屬於微軟的自定義型別,但其本質上還是屬於c c 裡面的那幾個標準型別。那用巨集定義到底有什麼好處呢?先來看一下巨集的定義 用 define命令將乙個指定的識別符號 即巨集名 來代表乙個字串。它的一般型式...

巨集定義的優缺點

公尺哈遊三面的乙個問題,問的很深,從巨集定義是什麼,幹什麼用,優缺點,到別的語言為什麼沒有,層層深入,很好的問題。結果我也很好的掛掉了。所以來討論一下上述幾個問題正確的答案到底是什麼。1.首先什麼是巨集定義,在c 中只有 define算是巨集定義,其餘的 操作都叫預處理,所以巨集定義就是 defin...

巨集定義的優缺點

巨集定義的優缺點 當時沒答出來,只知道如果某個常量或者函式名很長的時候可以用巨集定義做替換,這樣的話程式也會比較美觀一點,可讀性也大大增強了。其實在用vc程式設計的時候就會遇到很多巨集定義,尤其是類似 long,lpctstr 等等之類的,它們屬於微軟的自定義型別,但其本質上還是屬於c c 裡面的那...