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