?? ??? ?這個條款或許改為“寧可以編譯器替換預(yù)處理器”比較好妈拌,因為或許 #define 不能被視為語言的一部分拥坛。那正是問題所在。
比如定義一個宏:
#define ASPECT_RATIO 1.653
?? ??? ?這個ASPECT_RATIO也許從未被編譯器看見尘分。也許在編譯器開始處理源碼之前就被預(yù)處理器移走了猜惋。于是記號名稱ASPECT_RATIO有可能沒進入記號表內(nèi),當你運用此常量但獲得一個編譯器錯誤信息時培愁,可能會帶來困惑著摔,因為這個錯誤信息也許會提到1.653而不是ASPECT_RATIO。
?? ?解決方法是用常量來替換宏:
?? ??? ?const double AspectRatio = 1.653
?? ??? ?作為一個語言常量定续,AspectRatio肯定會被編譯器看到谍咆,當然就會進入記號表內(nèi)。此外對浮點常量而言私股,使用常量可能比使用#define 產(chǎn)生的代碼量少摹察,因為預(yù)處理器“盲目地將宏名稱ASPECT_RATIO替換為1.653”可能導致目標碼出現(xiàn)多份1.653,若改用常量AspectRatio絕不會出現(xiàn)相同情況倡鲸。
另外有時候代碼用宏來定義一個簡單的函數(shù)供嚎,比如:
? ? #define RECTANGULAR_AREA(a, b) f(a*b)
? ? 當然上述寫法是有問題的,之前在面試題庫中就找到過類似的問題峭状,當“a”是一個(2+3)這種形式的值時就會出錯克滴。
? ? 正確寫法:
? ? #define RECTANGULAR_AREA(a, b) f((a) * (b))
這里可以寫一個inline函數(shù)來替換到該宏,就是一個簡單的乘法運算宁炫。
template<typename T>
inline T rectanglarArea(const T& a, const T& b) {
? ? return a*b
}