您的位置:首页 > 编程语言 > C语言/C++

Effective C++ 条款02解读: 尽量以const, enum, inline替换#define

2015-06-14 22:35 549 查看
       尽量以const, enum, inline替换#define的意思是: 宁可以编译器替换预处理器。

       宏虽然广受诟病, 但是, 在很多实际代码中, 宏可以说无处不在, 甚至, 比起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++有这条重要的建议, 但不采纳这条建议的人, 比比皆是。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: