首页 > 代码库 > 最好以编译器代替预处理器
最好以编译器代替预处理器
这是《Effective C++》第二条。尽量以const,enum,inline替换#define。至于为何,意义就在于“最好以编译器代替预处理器”。
首先了解#define的作用域:
不管是在某个函数内,还是在所有函数之外,作用域都是从定义开始直到整个文件结尾。
当我们以常量替换#define,有两种情况需要注意,一是定义常量指针,因为常量经常被定义在头文件,以便被不同源码引用,因此有必要将指针而不只是所指之物声明为const。例如,const char* const name = "Jack"这样的写法就说明,指针是常量只能指向固定的内存,且不能通过指针修改其指向的内容。const出现在*左边,表示被指物是常量,出现在右边表示指针自身是常量。
上述这样写更好const std::string name("Jack");
对于类的成员变量,需要设置为static,限制其为类的成员只有一份,而非每实例化对象一次就有一份。另外就是要求为声明式而非定义式。
应该static const int num = 5; 而非static const int num;
因为后者会给一个默认的值并且以后无法更改。
《Effective C++》中这样描述enum hack
的好处(具体看看这篇文章http://www.cnblogs.com/jiqingwu/p/cpp_enum_hack.html):
-
enum hack
的行为更像#define
而不是const
,如果你不希望别人得到你的常量成员的指针或引用,你可以用enum hack
替代之。(为什么不直接用#define
呢?首先,因为#define
是字符串替换,所以不利于程序调试。其次,#define
的可视范围难以控制,比如你怎么让#define
定义的常量只在一个类内可见呢?除非你用丑陋的#undef
。 -
使用
enum hack
不会导致 “不必要的内存分配”。 -
enum hack
是模板元编程的一项基本技术,大量的代码在使用它。当你看到它时,你要认识它。
最好以编译器代替预处理器