条款一:尽量使用const、inline而不是#define
#define ASPECT_RATIO 1.653
编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。如果涉及到这个常量的代码在编译时报错,就会很令人费解,因为报错信息指的是1.653,而不是ASPECT_RATIO。
解决这个问题的方案很简单:不用预处理宏,定义一个常量:
const double ASPECT_RATIO = 1.653;
另一个普遍的#define指令的用法是用它来实现那些看起来象函数而又不会导致函数调用的宏。典型的例子是计算两个对象的最大值:
#define max(a,b) ((a) > (b) ? (a) : (b))
int a = 5, b = 0; max(++a, b);// a 的值增加了2次 max(++a, b+10); // a 的值只增加了1次
你可以用普通函数实现宏的效率,再加上可预计的行为和类型安全,这就是内联函数:
template<class T> inline const T& max(const T& a, const T& b) { return a > b ? a : b; }
--------------------------------------------------------------------------------------------------------------
预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理,预处理指令是以#号开头的代码行。
--------------------------------------------------------------------------------------------------------------
char *s1 = "hello";
char s2[] = "hello";
char *s1 的s1,指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
char s2[]的s2 是数组对应着一块内存区域,其地址和容量在生命期里不会改变,只有数组的内容可以改变
s2=s1; //编译出错,s2地址和容量在生命期里不能改变
s1=s2; //OK
--------------------------------------------------------------------------------------------------------------
class player { public://常量声明式,static const static const int num = 5;int scores[num]; };//定义式,应当放在一个实现文件而非头文件,该常量已在声明时获得初值,定义时不可以再设初值 const int player::num;
the enum hack:一个属于枚举类型的数值可以当作int使用,enum hack是模板元编程的基础技术
class game { private:enum{num = 5};int score[num]; };
转载于:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3890032.html
条款一:尽量使用const、inline而不是#define相关推荐
- 在定义常量时,为什么推荐使用const,而不是#define?
在定义常量时,为什么推荐使用const,而不是#define? const修饰词可以将一个变量修饰为"只读",这个就能称为常量么?姑且认为可以.const是只读的意思,它限定一个变 ...
- Effective C++ 条款02:尽量使用const,enum,inline替换#define
Effective C++ 条款02:尽量使用const,enum,inline替换#define 用另一句话说:用编译器代替预处理器比较好. 举个例子:加入定义一个常量: #define ASPEC ...
- 条款02:尽量以const,enum,inline代替#define
我们经常用define做什么? 1) 定义一个常量 2) 定义一个宏 为什么说尽量不用define.那么以这两个方面来解释: 1) 当我们定义一个常量时,我们可以用以下方式: #define A ...
- Effective C++ item01 尽量以const enum inline替换#define
1.尽量用const.enum.inline代替宏#define 使用编译器替换预处理器,或许#define可以不被视为C++语言中的一部分,如下面的代码: #define PI 3.14 名称PI也 ...
- 尽量使用const、enum、inline代替#define
1. # define A 1.6 宁可使用编译器也不使用预处理,原因: 当使用预处理时,记号名称A也许从未被编译器看见(因为预处理是在编译阶段进行替换),所以一旦出现编译错误,(如果A被定义在一个非 ...
- C/C++面试:尽量以const、enum、inline替换#define
#defnie常量 原因 因为#define不被视为语言的一部分 问题 当定义: #define ASPECT_INFO 1.632 它可能不会被编译器看见: 在编译器开始处理源码之前就被预编译器移走 ...
- 2.尽量用const, enum, inline代替#define -- Prefer const, enum, inline to #define.
1. 我们都知道,#define PRICE 30 是预编译处理器进行预编译的时候执行的,无法在编译器进行编译的过程中看见,因此,当编译出错的时候,通常错误信息是提到30,而不是PRICE,因此程序员 ...
- C++尽量以const,enum,inline替换#define
最好编译器替换预处理器 以const替换#define 以enum替换#define 以inline替换#define 以const替换#define #define ASPECT_RATIO 1.6 ...
- [EffectiveC++]item02:尽量以const,enum,inline代替#define
转载于:https://www.cnblogs.com/jeanschen/p/3214662.html
最新文章
- 数据库路由中间件MyCat - 使用篇(2)
- 【c++基础】ifstream的构造函数
- ddl是什么意思网络语_DDL语句是啥
- 一个快速、高效的Levenshtein算法实现
- Query 创建方法
- A quick introduction to Google test
- Presenting the Permanent Generation
- Note: HTML5 识别语音相关的一些资源
- 剑指offer48-最长不含重复字符的子字符串(双指针经典)
- 《IT项目管理那些事儿》——新浪微博抽奖活动
- 计算机组成原理—主存容量扩展
- 使用jekins自动构建部署java maven项目(jdk1.7+tomcat7.0+jenkins2.19.3)
- 查看Cglib生成的Class(字节码)文件
- 鸿蒙支持ps4手柄吗,PS5硬件兼容性测试:哪些PS4硬件可以在PS5上使用
- Android仿人人客户端(v5.7.1)——人人授权访问界面
- QUIC会成为互联网传输的颠覆者吗?
- CPP design pattern Singleton
- java基础猜拳游戏
- 什么是m叉树_品读 | 记忆深处那些树
- 智联卓聘 卓聘聊聊(IM)开发实践