#define、const和enum】的更多相关文章

02.尽量以const,enum,inline代替#define 原因:编译前的预处理会替换宏,所以调试的时候找不到错误 1.const 尽量用const替代常量宏定义 两种特殊情况: (1).常量指针 通常定义为const char * const cstr="hello world"; 即要把指针本身定义为const,而不仅仅是指针指向的值,通常用string替代char*-based: const string str("hello world"); (2).…
Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 2. 尽量以 const, enum, inline 替换 #define (prefer consts, enums and inlines to #define) 这个条款或许可以改为"宁可以编译器替换预处理器"比较好,因为或许 #define 不被视为语言的一部分. 对于 #define ASPECT_RATIO 1.653 记号名称 ASPEC…
1> 以const替换#define • 比如用const double Ratio = 1.653替换#define RATIO 1.653 因为宏定义在预处理阶段就会被替换成其所指代的内容,然后才是对替换后的内容进行编译,因此编译器永远不能发现宏的存在.此时如果宏变量RATIO出现问题,那么编译器只会报出是1.653出现问题,是不是相当莫名其妙?究其原因就是所使用的宏变量压根没进入到符号表中,编译器看不到. • 如何定义类内常量,就是对该类而言只有一份的那种变量?当然我们会想到static,…
条款02: 尽量以 const, enum, inline 替换 #define 这个条款或许可以改为“宁可以编译器替换预处理器”. 编译过程: .c文件--预处理-->.i文件--编译-->.o文件--链接-->bin文件 如果你做出这样的事: #define ASPECT_PATIO 1.653 记号名称 ASPECT_PATIO 从未被编译器看见:也许在编译器开始处理源代码之前它就被预处理器移走了.于是记号名称 ASPECT_PATIO 有可能没有进入符号表(symbol tabl…
#define ASPECT_RATIO=1.1const double AspectRatio=1.1 1. 使用宏会导致预处理器把程序代码中的ASPECT_RATIO无条件替换为1.1,编译器从未见过ASPECT_RATIO,调试编译会很难跟踪,const常量可以解决这个问题. 2. 宏定义的作用域是其后的编译过程,直到被#undef,因此宏定义不能作为类的专属常量,例如我们想在类中定义一个数组,数组的大小需要一个常量,我们会用以下方式实现: class Test { private: ;…
ilocker:关注 Android 安全(新手) QQ: 2597294287 #define ASPECT_RATIO 1.653 记号 ASPECT_RATIO 不会进入 symbol table,因为它在预处理阶段就被替换了. 如果运用此常量时获得了一个编译错误,并且该宏定义又非自己所写,就会对 1.653 为何意.来自何处而感到困惑.于是,我们会因为追踪代码而浪费时间. 应以常量取而代之: const double kAspectRatio = 1.653; 这样没准还会减小 obje…
1.考虑为什么? 首先,#define不是语言的一部分,而是预编译过程.也就是在编译器编译之前,进行文本替换.考虑#define Pi 3.1425:在编译之前,Pi都会被文本替换为3.1415,因此编译器看不到Pi这个标识.这会增加调试难度.同时文本替换导致目标码中出现多份3.1415. 2.尽量不使用#define,就要使用替代办法. 3.对于#define Pi 3.1415这样形式,使用const替换const double Pi = 3011415;以const替换#define,有两…
In one word, using const is better than define. enum is the best. There are lots of discussions. I put a great paper below. https://betterembsw.blogspot.com/2017/05/define-vs-const.html The compiler might generate storage for a constant object, even…
1.#define为预处理阶段命令 原因:有可能记号名称没有进入记号表,而出现编译错误,即编译器并没看到过该定义. class专属常量const 一般定义为static,保证该常量至多有一份实体. 枚举类型值可充当intS型使用.enum{num=3};现在num就是3的一个记号. 对于取地址操作:const是合法的,但是enum和define不能进行取地址操作. #define定义函数宏的时候容易产生歧义.(括号分配等等,计算顺序..) 宏无法定义成private,但是内联函数inline可以…
Effective C++在此条款中总结出两个结论 1.对于单纯常量,最好以const对象或enum替换#define 2.对于形似函数的宏,最好改用inline函数替换#define 接下来我们进行详细的探讨. const替换#define的讨论 例如: #define ASPECT_RATIO 1.653 原书给出的解释大意是: 你所使用的名称(ASPECT_RATIO)可能并未进入记号表(symbol table),原因也许是记号名称ASPECT_RATIO从未被编译器看见,也许在编译器开…