1. 程式人生 > >條款02:盡量以const,enum,inline替換#define

條款02:盡量以const,enum,inline替換#define

版本 fin all 作用域 inline 容易 amp oid def

一、概述

盡量少用預處理器——宏替換

二、細節

1. 關於宏替換之常量

舊版本:#define N 10;

新版本:const int n = 10;

比較:#define不被視為語言的一部分,記號名稱N在編譯器開始處理源代碼之前就被預處理器移走了。

補充:class的專屬常量需要封裝性,而#define不能提供封裝性(它並不重視作用域)。

2. 形似函數的宏

舊版本:#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))

新版本:template<typename T> inline void callWithMax(const T &a, const T &b) { f(a > b ? a : b); }

比較:舊版本中對於調用實參時有很大的約束,而且很復雜;而inline與它的效率相似但形式容易且不易出錯。

補充:callWithMax是個真正的函數,它遵守作用域和訪問規則;而你不能用宏寫一個class的private成員函數。

3. enum的成員是const的,故可作為常量表達式

條款02:盡量以const,enum,inline替換#define