宏定義的優缺點


  今天中午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陷進與缺陷》的一句話,對其進行總結:

宏並不是函數,宏並不是語句,宏並不是類型定義

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM