关于
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
.宏名不能重载,而且宏预处理器不能处理递归调用。