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

这是《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是模板元编程的一项基本技术,大量的代码在使用它。当你看到它时,你要认识它。
时间: 2024-10-10 00:52:00

最好以编译器代替预处理器的相关文章

22.预处理器

//C预处理器 /* C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤. 简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理. 我们将把 C 预处理器(C Preprocessor)简写为 CPP. 所有的预处理器命令都是以井号(#)开头. 它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始. 下面列出了所有重要的预处理器指令: #define 定义宏 #include包含一个源代码文件 #undef 取消已定义的宏

1.预处理器,编译器,汇编器和链接器

摘自http://www.cnblogs.com/maomaohhmm/archive/2012/10/28/2743903.html 1.预处理器,编译器,汇编器和链接器 (1).预处理(cpp):预处理器不止一种,而C/C++的预处理器就是其中最低端的一种——词法预处理器,主要是进行文本替换.宏展开.删除注释这类简单工作. gcc -E 选项可以得到预处理后的结果,扩展名为.i: C/C++预处理不做任何语法检查,不仅是因为它不具备语法检查功能,也因为预处理命令不属于C/C++语句(这也是定

C预处理器

C预处理器是一种简单的宏处理器. 预处理器是由特殊的预处理器命令行控制的,它们是以#符号开头的源文件行. 预处理器的一般操作:从源文件中删除所有的预处理器命令行,并在源文件中执行这些预处理器命令所指定的转换操作 预处理器代码行的语法与C语言其他部分的语法是完全独立的,但经过预处理所产生的源代码必须在上下文环境中合法 常见的预处理器命令: #define  定义一个预处理器宏   #undef     取消一个预处理器宏 #include   插入另一个源文件的文本 #if        测试一个

关于前端CSS预处理器Sass的小知识!

前面的话 ??"CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工具,提 供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护.本文将详细介绍sass的使用 定义 ??Sass是一门高于CSS的元语言,它能用来清晰地.结构化地描述文件样式,有着比普通CSS更加强大的功能.Sass能够提供更简洁.更优雅的语法,同时提供多种功能来创建可维护和管理的样式

C Primer Plus之C预处理器和C库

编译程序前,先由预处理器检查程序(因此称为预处理器).根据程序中使用的预处理器指令,预处理器用符号缩略语所代表的内容替换程序中的缩略语. 预处理器不能理解C,它一般是接受一些文件并将其转换成其他文本. 翻译程序的第一步 对程序作预处理前,编译器会对它进行几次翻译处理. 编译器首先把源代码中出现的字符映射到源字符集(?).该过程处理多字节字符和使C外观更加国际化的三元字符(?)扩展 编译器查找反斜线(\)后紧跟换行符的实例并删除这些实例.注意:在这种场合下,“换行符”代表按下回车键在源代码文件中新

【C/C++】C预处理器

C预处理器处理程序的源代码,在编译器之前运行,通常以"#"开头. C语言的预处理主要有三个言而的内容: 1) 宏定义和宏替换: 2) 文件包含: 3) 条件编译. 1. 宏定义和宏替换 "宏"是借用汇编语言中的概念,为的是在C语言程序中方便的作一些定义和扩展.这些语句以#define开头,分为两种:符号常量的宏定义和带参数的宏定义. 1) 符号常量的宏定义和宏替换 1 #define 标识符 字符串 其中标识符就称为宏名称,注意宏定义末尾不加分号. 由于预处理是在编

一些C#预处理器指令

像C语言一样,C#有一些预处理器指令的命令.例如,#if#end if,#define等,所谓这些命令是指不会转化为可执行代码中的一些命令,只是在编译的过程中起作用.下面简要介绍一下:1 .#define和 #undef#define的用法如下所示:#define DEBUG 它告诉编译器存在给定名称的符号,在本例中是DEBUG.这有点类似于声明一个变量,但这个变量并没有真正的值,只是存在而已.这个符号不是实际代码的一部分,而只在编译器编译代码时存在.在C#代码中它没有任何意义.#undef正好

PHP (超文本预处理器)

1.PHP(外文名:PHP: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域.PHP 独特的语法混合了C.Java.Perl以及PHP自创的语法.它可以比CGI或者Perl更快速地执行动态网页.用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI

CSS预处理器Sass(Scss)、Less、Stylus

CSS 预处理编译器能让我成程序化其的方式编写CSS代码,可以引入CSS中没有的变量.条件.函数等特性,从而让代码更简单易维护,但一般按预处理器语法编写的代码无法直接在浏览器中运行,需用通过工具比如gulp转换成标准的CSS语法,从而在浏览器中运行.个人理解它是标准CSS语法的扩展及增强,能在一定程度上提高编码效率. 三种预处理器的对比: Sass诞生是最早也是最成熟的CSS预处理器,有Ruby社区和Compass支持:安装.编译依赖Ruby环境: Stylus早期服务器Node JS项目,在该