美文网首页
#define宏常量和const常量的区别

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

作者: 霜之幽语 | 来源:发表于2017-11-14 09:34 被阅读58次

C++ 语言可以用const来定义常量,也可以用#define来定义常量。但是前者比后者有更多的优点:

  • const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
  • 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。规则5-2-1:在C++ 程序中只使用const 常量而不使用宏常量,即const常量完全取代宏常量。

2.实现机制

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

3.用法区别
#define宏定义和const常变量区别:

  • 1.#define是宏定义,程序在预处理阶段将用#define定义的内容进行了替换。因此程序运行时,常量表中并没有用#define定义的常量,系统不为它分配内存。const定义的常量,在程序运行时在常量表中,系统为它分配内存。
  • 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可以在任何地方定义常量,编译器对它的处理过程与变量相似,只是分配内存的地方不同。

相关文章

  • iOS 日常小知识点总结

    define和const常量有什么区别 define在预处理阶段进行替换, const常量在编译阶段使用;宏不做类...

  • 一些小链接

    1、iOS 宏(define)与常量(const)的正确使用 iOS宏(define)与常量(const)的正确使...

  • const常量与define宏定义的区别

    在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。以下是const和define...

  • #define宏常量 、const常量区别

    (1) 编译器处理方式不同define宏是在预处理阶段展开。const 常量在 编译阶段 使用(2) 类型和安全检...

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

    C++ 语言可以用const来定义常量,也可以用#define来定义常量。但是前者比后者有更多的优点: const...

  • ios细小知识点总结

    一、 defin定义的宏和const定义的常量的区别 define定义的常量,程序在预处理阶段只是直接用defin...

  • iOS技术基础

    一、define定义的宏和const定义的常量有什么区别? define定义宏的指令,程序在预处理阶段将用#def...

  • const和#define

    (1)const和#define都可以定义常量,但是const用途更广。 (2)const 常量有数据类型,而宏常...

  • 宏(define)与常量(const)

    参考文档 iOS 宏(define)与常量(const)的正确使用 15分钟弄懂 const 和 #define ...

  • #define const static

    iOS 宏(define)与常量(const)的正确使用

网友评论

      本文标题:#define宏常量和const常量的区别

      本文链接:https://www.haomeiwen.com/subject/gdrxvxtx.html