关于宏

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

posted on 2006-03-29 21:21 bo 阅读(741) 评论(0)  编辑 收藏 引用 所属分类: Language


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2006年3月>
2627281234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(4)

随笔分类(23)

随笔档案(23)

URL

最新随笔

搜索

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜