最好以编译器代替预处理器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最好以编译器代替预处理器相关的知识,希望对你有一定的参考价值。

这是《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):

  1. enum hack的行为更像#define而不是const,如果你不希望别人得到你的常量成员的指针或引用,你可以用enum hack替代之。(为什么不直接用#define呢?首先,因为#define是字符串替换,所以不利于程序调试。其次,#define的可视范围难以控制,比如你怎么让#define定义的常量只在一个类内可见呢?除非你用丑陋的#undef

  2. 使用enum hack不会导致 “不必要的内存分配”。

  3. enum hack是模板元编程的一项基本技术,大量的代码在使用它。当你看到它时,你要认识它。

以上是关于最好以编译器代替预处理器的主要内容,如果未能解决你的问题,请参考以下文章

损坏的顶点和片段着色器

jQ选择器学习片段(JavaScript 部分对应)

如何从该片段中的 onItemSelectedListener 中获取微调器单击的项目?

片段着色器是不是处理来自顶点着色器的所有像素?

CSAPP

为什么片段着色器不会编译?