首页 > 试题广场 >

const和define有什么区别?

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指向的对象都不可变
发表于 2015-07-16 17:02:27 回复(0)
1)const对应编译器;#define对应预处理器
    例如:#define WQQ 3.5;
    编译器将永远看不到WQQ这个符号,因为在源码进入编译之前,这个符号会被预处理器处理掉,于是WQQ这个符号不会加入符号列表。如果涉及到这个常量的代码在编译时报错,就很令人费解。因为报错的是3.5而不是WQQ,再如果这个WQQ不是在自己的头文件中定义的,后果可想而知...
2)const有类型安全检查,而宏常量则没有
    对后者只能进行字符串替换,替换过程可能会产生意想不到的错误;
3)某些集成化调试工具可以对const常量进行调试,但是不能对宏常量调试
4)存储方式不同
    define定义的常量仅仅是展开,有多少地方使用就展开多少次,在替换后运行过程中会不断占用内存;而const定义的常量存储在数据段,只有一份拷贝


发表于 2015-06-18 13:44:55 回复(0)
const和define:
const为常量值,define为字符串替换。
1.const在编译阶段使用;define在预编译阶段使用。
2.const有数据类型,做安全检查;define无类型,不做安全检查。
3.const可以调试;define不能调试。
4.const占用一份内存;define不占用内存,但是会多处进行字符串替换
发表于 2015-07-26 10:34:32 回复(1)
1.编译器处理阶段不同:
    define宏在编译预处理阶段展开, const常量在编译阶段使用
2.类型安全检查不同
    defined宏没有类型,不做类型检查,只做简单的展开
    const常量有类型,在编译阶段会执行类型检查
3.存储方式不同
    define定义的常量在替换后运行过程中会不断地占用内存,在内存中有若干份copy,而const定义的常量存储在数据段,只有一份copy,效率更高。
4.能否调试
    define定义的常量不能被调试,const常量可以。
5.效率不同
    编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。  
发表于 2015-06-12 09:15:54 回复(1)
除了参考答案之外,还有一点是,const 在程序中只有一个备份,而define 有多个备份!!
发表于 2016-11-25 01:16:50 回复(0)
const和define都可以定义常量,区别如下:
1、define定义常量发生在预处理阶段,只做简单的文本替换,而const发生在编译阶段,会为变量分配内存;
2、define定义的常量没有数据类型,而const有,const可以进行类型安全检查;
3、define定义的常量不能被调试,而const可以;
4、define定义的常量在替换后运行过程中会不断地占用内存,而const定义的常量存储在数据段,只有一份copy,效率更高。
一般使用const更好。
编辑于 2015-06-08 16:31:01 回复(0)

1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查。

2)有些调试工具可以对const常量进行调试,但不能宏常量进行调试

3)define宏是在预处理阶段进行替换,const常量是在编译阶段确定其值

4)define宏不会分配内存,而是在替换时对变量分配内存,const常量会在内存中分配

5)const定义的常量在程序运行过程中只有一份拷贝(静态区),而define定义的常量在内存中有若干个拷贝。

发表于 2017-10-02 21:38:50 回复(0)
const 分为 编译时 和 运行时 
const int a = 1;  //编译时
const int b = func();//运行时

还是有区别的
发表于 2015-09-09 13:52:32 回复(0)
(1) 编译器处理方式不同

define宏是在预处理阶段展开。

const常量是编译运行阶段使用。

(2) 类型和安全检查不同

define宏没有类型,不做任何类型检查,仅仅是展开。

const常量有具体的类型,在编译阶段会执行类型检查。

(3) 存储方式不同

define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。

const常量会在内存中分配(可以是堆中也可以是栈中)。
(4)const   可以节省空间,避免不必要的内存分配。
(5)const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而  #define定义的常量在内存中有若干个拷贝。 
(6) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
发表于 2015-06-11 16:22:59 回复(0)
C++可以用const来定义常量,也可以用#define来定义常量,但前者与后者相比有明显的优势。
const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查而后者只是简单的替换,没有类型安全检查,而且在替换过程中可能会发生意想不到的错误
某些集成化调试工具可以对const常量进行调试,但不能对宏常量进行调试
发表于 2015-05-30 08:15:53 回复(0)
c++中definde和const都可以定义常量,但是是有以下区别:
1.definde是简单的文本替换,是在编译预处理进行,const是在编译时进行,const是分配内存的
2.definde没有类型的概念,const可以进行类型的检查
3.definde可以定义一些简单的函数,const不可以
4.definde定义的常量不能调试,const可以进行调试
5.const避免不必要的内存分配,而且效率更高
发表于 2015-05-28 08:20:07 回复(0)
本质:define只是字符串替换,const参与编译运行,具体的:
• define不会做类型检查,const拥有类型,会执行相应的类型检查
• define仅仅是宏替换,不占用内存,而const会占用内存
• const内存效率更高,编译器通常将const变量保存在符号表中,而不会分配存储空间,这使得它成 为一个编译期间的常量,没有存储和读取的操作
编辑于 2015-05-18 13:11:14 回复(0)