问题标题: 酷町堂:大佬留步,送豆啦!

0
0
已解决
李泽远
李泽远
高级天翼
高级天翼

求#define和const的区别

同样是常量定义,只不过#define是预处理器而已,有什么区别呢?

注意:我要的不是用法区别,是意义区别。


0
已采纳
毛润宇
毛润宇
新手天翼
新手天翼
(1) 编译器处理方式不同
  define宏是在预处理阶段展开。
  const常量是编译运行阶段使用。
(2) 类型和安全检查不同
  define宏没有类型,不做任何类型检查,仅仅是展开。
  const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
  define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
  const常量会在内存中分配(可以是堆中也可以是栈中)。

(4)const  可以节省空间,避免不必要的内存分配。 例如:  
        #define PI 3.14159 //常量宏  
        const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......  
        double i=Pi; //此时为Pi分配内存,以后不再分配!  
        double I=PI; //编译期间进行宏替换,分配内存  
        double j=Pi; //没有内存分配  
        double J=PI; //再进行宏替换,又一次分配内存!  
        const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。 
(5) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
1
被禁言 姜思远
姜思远
初级光能
初级光能

const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝。
#define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。
#define宏没有类型,而const修饰的只读变量具有特定的类型
===========================================
const int *p;   //p可变,p指向的对象不可变
int const*p;  //p可变,p指向的对象不可变
int *const p;  //p不可变,p指向的对象可变
const int *const p;  //指针p和p指向的对象都不可变
====================================
总的来说:
const:有数据类型,编译进行安全检查,可调试
define:宏,不考虑数据类型,没有安检,不能调试
================================
这里有一个记忆和理解的方法:
先忽略类型名(编译器解析的时候也是忽略类型名),我们看const离哪个近。"近水楼台先得月",离谁近就修饰谁。
判断时忽略括号中的类型
const (int) *p;   //const修饰*p,*p是指针指向的对象,不可变
(int) const *p;  //const修饰*p,*p是指针指向的对象,不可变
(int)*const p;   //const修饰p,p不可变,p指向的对象可变
const (int) *const p;  //前一个const修饰*p,后一个const修饰p,指针p和p指向的对象都不可变

1
被禁言 姜思远
姜思远
初级光能
初级光能

C++可以用const定义常量,也可以使用#define来定义常量,但是前者比后者有更多的优点:
1,const常量有数据类型,而宏常量没有数据类型,编译器可以对前者进行静态类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能产生意想不到的错误(边际效应)
2,有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
 
所以在C++中应尽量使用const来定义符号常量,包括字符串常量。
被const修饰的东西都受到c++/c语言实现的静态类型安全机制的强制保护,可以预防意外修改,提高程序的健壮性。
---------------------
版权声明:本文为CSDN博主「lifengguo_njupt」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lifengguo_njupt/article/details/7992332

0
黄昊轩
黄昊轩
中级守护
中级守护

这个区别用从几个角度来说:

角度1: 
就定义常量说的话: 
const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。

角度2: 
就起作用的阶段而言: 
define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。

角度3: 
就起作用的方式而言: 
define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。 
正因为define只是简单的字符串替换会导致边界效应,具体举例可以参考下面代码:

#define N 2+3 //我们预想的N值是5,我们这样使用N
double a = N/2;  //我们预想的a的值是2.5,可实际上a的值是3.5
1
2
角度4: 
就空间占用而言: 
例如:

#define PI 3.14     //预处理后 占用代码段空间
const float PI=3.14;    //本质上还是一个 float,占用数据段空间
1
2
角度5: 
从代码调试的方便程度而言: 
const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了

角度6: 
从是否可以再定义的角度而言: 
const不足的地方,是与生俱来的,const不能重定义,而#define可以通过#undef取消某个符号的定义,再重新定义。

角度7: 
从某些特殊功能而言: 
define可以用来防止头文件重复引用,而const不能,可以参看下面代码:

//主要把以下代码放在头文件中,可以防止头文件被重复引用
#ifndef xxx//如果没有定义xxx
#define xxx//定义xxx

//这里是你的代码

#endif //结束如果
--------------------- 
版权声明:本文为CSDN博主「aaronymhe」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yi_ming_he/article/details/70405364

0
李明翰
李明翰
新手光能
新手光能

这个从百度上搜一下就知道了

0
周昇平
周昇平
中级守护
中级守护

水贴!!!!!!!!!!!!!!!!!!!!!!举报

0
0
我要回答