#define宏常量和const常量的区别

 

C++ 语言能够用const 来定义常量,也能够用#define 来定义常量。可是前者比后者有更多的优势:
(1) const 常量有数据类型,而宏常量没有数据类型。编译器能够对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,而且在字符替换可能会产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具能够对const 常量进行调试,可是不能对宏常量进行调试。规则5-2-1:在C++ 程序中只使用const 常量而不使用宏常量,即const 常量彻底取代宏常量。html

2.实现机制c++

宏是预处理命令,即在预编译阶段进行字节替换。const常量是变量,在执行时const定义的只读变量在程序运行过程当中只有一份拷贝(由于它是全局的只读变量,存放在静态存储区的只读数据区。根据c/c++语法,当你声明该量为常量,即告诉程序和编译器,你不但愿此量被修改。 程序的实现,为了保护常量,特将常量都放在受保护的静态存储区内。凡是试图修改这个区域内的值,都将被视为非法,并报错。 这不能理解为凡是字符串都是放在静态存储区域的。这个跟数据类型没有关系,而是这个量是变量仍是常量的问题。例如,一个字符串变量就是能够被修改的。 这种静态存储区域的保护机制是由编译器实现的,而非存储该值的内存的电器属性。换言之,实质上内存永远均可以被用户随意修改,只是编译器给用户的代码注入了一些本身的保护代码,经过软件手段将这段内存软保护起来。这种保护在汇编级别能够轻松突破,其保护也就无效了。)。安全

3.用法区别工具

define宏定义和const常变量区别:post

1.define是宏定义,程序在预处理阶段将用define定义的内容进行了替换。所以程序运行时,常量表中并无用define定义的常量,系统不为它分配内存。const定义的常量,在程序运行时在常量表中,系统为它分配内存。url

2.define定义的常量,预处理时只是直接进行了替换。因此编译时不能进行数据类型检验。const定义的常量,在编译时进行严格的类型检验,能够避免出错。调试

3.define定义表达式时要注意“边缘效应”,例如以下定义:
#define N 2+3 //咱们预想的N值是5,咱们这样使用N,int a = N/2; //咱们预想的a的值是2,可实际上a的值是3。缘由在于在预处理阶段,编译器将 a = N/2处理成了 a = 2+3/2;这就是宏定义的字符串替换的“边缘效应”所以要以下定义:#define N (2+3)。const定义的表达式则没有上述问题。const定义的常量叫作常变量缘由有二:const定义常量像变量同样检查类型;const能够在任何地方定义常量,编译器对它的处理过程与变量类似,只是分配内存的地方不一样。htm

相关文章
相关标签/搜索