Effective C++ 条款02解读: 尽量以const, enum, inline替换#define
2015-06-14 22:35
549 查看
尽量以const, enum, inline替换#define的意思是: 宁可以编译器替换预处理器。
宏虽然广受诟病, 但是, 在很多实际代码中, 宏可以说无处不在, 甚至, 比起const, enum, inline, 很多人更喜欢用宏。但宏真的有很多不好的地方,宏仅仅是一个简单的替换, 所以, 在展开的时候会出现很多问题, 最常见的就是少括号啊、对++敏感啊等等, 今天, 我就不说这种低级的错误了。
为什么要用const代替宏? 原因太多, 我不一一列举。 看程序:
为什么要以enum带代替宏呢? 看看下面这个糟糕的程序吧:
为什么要以inline代替#define呢? 这得从我某年某月某日经历的一次笔试题目说起, 笔试题目是:#define MAX3(a, b, c) xxx ,要求完成xxx的部分。 当时看到这个题目, 我就觉得很无聊, 无聊归无聊, 我得做啊, 最后, 我写了一个自认为正确的结果, 可读性非常差。至今, 我都没法100%保证是否正确。 别纠结了, 还是用inline来搞吧:
那完全不用宏行不行呢? 也是不行的。 比如:
1. #include不能少吧。
2. const, enum, inline没法实现头文件卫士的功能,所以还是要依赖于宏。
最后, 现实是, 虽然Effective C++有这条重要的建议, 但不采纳这条建议的人, 比比皆是。
宏虽然广受诟病, 但是, 在很多实际代码中, 宏可以说无处不在, 甚至, 比起const, enum, inline, 很多人更喜欢用宏。但宏真的有很多不好的地方,宏仅仅是一个简单的替换, 所以, 在展开的时候会出现很多问题, 最常见的就是少括号啊、对++敏感啊等等, 今天, 我就不说这种低级的错误了。
为什么要用const代替宏? 原因太多, 我不一一列举。 看程序:
#include <iostream> using namespace std; #define PI 3.14 int main() { cout << PI << endl; return 0; }其中PI是一个宏, 不是一个变量, 所以预编译器提前处理了它, 编译器对它完全没有感知,无法调试。 所以, 宏容易引起错误, 且不便于调试。
为什么要以enum带代替宏呢? 看看下面这个糟糕的程序吧:
#include <iostream> using namespace std; #define RED 0 #define BLACK 1 #define GREEN 2 #define YELLOW 3 int main() { return 0; }看看, 逻辑没个逻辑, 而且啰嗦, 还不如写成:
#include <iostream> using namespace std; enum { RED, BLACK, GREEN, YELLOW }; int main() { return 0; }
为什么要以inline代替#define呢? 这得从我某年某月某日经历的一次笔试题目说起, 笔试题目是:#define MAX3(a, b, c) xxx ,要求完成xxx的部分。 当时看到这个题目, 我就觉得很无聊, 无聊归无聊, 我得做啊, 最后, 我写了一个自认为正确的结果, 可读性非常差。至今, 我都没法100%保证是否正确。 别纠结了, 还是用inline来搞吧:
#include <iostream> using namespace std; inline int MAX3(int a, int b, int c) { int max = a > b ? a : b; return max > c ? max : c; } int main() { cout << MAX3(2, 5, 3) << endl; return 0; }
那完全不用宏行不行呢? 也是不行的。 比如:
1. #include不能少吧。
2. const, enum, inline没法实现头文件卫士的功能,所以还是要依赖于宏。
最后, 现实是, 虽然Effective C++有这条重要的建议, 但不采纳这条建议的人, 比比皆是。
相关文章推荐
- 第14周 【项目4 - 处理C++源代码的程序】(1)
- 素数环
- C语言中关于%d的使用方法
- (C++)浅谈多态基类析构函数声明为虚函数
- eclipse上配置c语言开发环境
- C++中的log
- c++ cin一个整数 输入其它字符产生死循环错误的解决方法。
- 深入Windows内核——C++中的消息机制
- 令Code::Blocks支持C++11特性
- c++ list
- Ecplise编译Cygwin环境、使用CDT插件开发C/C++
- c++ 头文件<cwchar>中常见函数的实现!!!
- C语言中static的作用
- c语言中realloc()函数解析
- C++中的临时对象
- C++ String类的简单实现与思考
- C++复制构造函数和赋值符的区别
- (C++)C++多态性中的静态绑定和动态绑定
- The partial sum problem
- 初窥c++11:lambda函数及其用法