關于
c
宏:
1.?
預編譯器將程序正文中將所遇到的宏名展開成宏定義。
#define PI 3.1415926
2.?
可以定義帶參數的宏,具有模板的部分功能,但是最好將宏參數用括號括起來。
#define MIN(a,b) (((a)<(b))?(a):(b))
3.?
通過
##
宏運算符可以拼接起兩個串。
#define NAME
(
a,b
)
a##b
4.?
#undef X
保證不再有稱為
X
的有定義的宏。
5.?
一種特殊的宏:條件編譯。
#ifdef MACRO_NAME
… …
#endif
意思是:除非應經定義了名為
MACRO_NAME
的宏,否則
#ifdef
與
#endif
之間的語句將被忽略。
?
C++
中應該盡量避免使用宏:
1
.
#define PI 3.1415926
可以使用
const double PI=3.1415926
代替。
2
.
#define MIN(a,b) (((a)<(b))?(a):(b))
可以使用函數模板代替。
template <class T>
inline T min(T a, T b)
{
?????? return (a<b)?a:b;
}
3.
用于拼接起兩個串的宏和條件編譯的宏仍然有其使用范圍。
?
宏的優點:
1.?
效率高,執行速度快。但是有的可以使用
C++
的
inline
函數代替,仍然保持其執行效率。
?
宏的缺點:
1
.缺乏類型安全檢查和作用域規則檢查,編譯器能看到的只是宏展開后的形式,所以在宏中的錯誤是在宏被展開之后報告的,而不是在它定義時,導致非常難以理解的錯誤信息。
2
.宏名不能重載,而且宏預處理器不能處理遞歸調用。