【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 6482|回复: 9

『辩论』#define与const的差别

[复制链接]
发表于 2006-4-13 11:53:15 | 显示全部楼层 |阅读模式

我想这个问题已经是一个老调长谈的问题了,很多人拥护const然而还有很多人坚决支持#define,总之吵来吵去没有定论,虽然他们在使用中感觉“差不多”,但是他们各自有什么优势,在实现上又有什么区别呢?

在此展开辩论话题讨论

1.讨论#define与const之间的区别与联系

2.#define与const之间优势与缺点

3.#define与const之间在程序调用中的实现

4.本着文明讨论,科学求实,严禁人身攻击

发表于 2006-4-18 08:06:26 | 显示全部楼层

“不过还是不知道具体的区别”??

-_-!....................

(1) #define Pi 3.1415926

(2) const float Pi=3.1415926;

(1)中的“Pi”,在编译器编译程序之前,把程序代码中所有的“Pi”换成“3.1415926”,其本身在内存中并没有分配“存储空间”

(2)中的“Pi”,直接在内存中分配大小为“float类型”的“存储空间”,其中存储的内容就是“3.1415926”,并且由于“const”

关键字的修饰,“Pi”中的存储内容在定义以后,不能被修改

如果还不明白的话,建议去找一本C语言的书,着重看看“预处理”的内容................

 楼主| 发表于 2006-4-18 09:58:07 | 显示全部楼层
我查到一个讲const与#define的差别的帖子,里面谈到const与#define最大的差别在于:前者在堆栈分配了空间,而后者只是把具体数值直接传递到目标变量罢了。或者说,const的常量是一个Run-Time的概念,他在程序中确确实实的存在可以被调用、传递。而#define常量则是一个Compile-Time概念,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参数,没有实际的存在。

const常量存在于程序的数据段,#define常量存在于程序的代码段。

至于两者的优缺点,要看具体的情况了。一般的常数应用,笔者个人认为#define是一个更好的选择:

i.从run-time的角度来看,他在空间上和时间上都有很好优势。

ii.从compile-time的角度来看,类似m=t*10的代码不会被编译器优化,t*10的操作需要在run-time执行。而#define的常量会被合并(在上例中T*10将被0x82取代)。

但是:如果你需要粗鲁的修改常数的值,那就的使用const了,因为后者在程序中没有实际的存在。(其实应该说修改数据段比代码段要简单^_^)。

发表于 2006-6-4 10:24:28 | 显示全部楼层

我认为用const定义全局变量是比较好的.

的搞不好的话用#define会引起问题的~~~(特别是初学者)

 楼主| 发表于 2006-4-13 12:00:43 | 显示全部楼层

我先开个头吧

在介绍C++的一些书籍都不主张使用#define

原因有以下几点:
1、定义#define,则必须是全局变量,当程序很大时,二者的差别就很容易看出来。也就是不利于程序的维护。
2?define是一种代替的意思,而const更能够体现定义的意思,const后面有数据类型,程序很明了。

所以我觉得应该多用const来定义

但是微软的程序例题中,大量的在使用#define 这让人很不解。难道是微软的程序员都是老一辈C语言程序员走过来,写程序不管是因为习惯还是为了兼容C,他们更偏爱#define吗?

发表于 2006-4-17 20:39:07 | 显示全部楼层

我认为当程序很大的时候往往define都是定义在一个头文件里面的这个还是不容易弄混的。不过我觉得define和const的功能有着本质的不同,define常常用在程序开头,而const常常用在程序里面比如某些函数或者参数里面,比如void fun(const int i)或者void fun(int i)const;但是你没有看到这样的用法吧void fun(define ....)

发表于 2006-4-17 20:46:15 | 显示全部楼层

e~~~~~~~~~~~~~~~~~

#define 并不是定义变量啊~~~~~~~~`兄弟们

#define 只是用来做文本替换的

例如:

#define Pi 3.1415926

float angel;

angel=30*Pi/180;

那么,当程序进行编译的时候,编译器会首先将 “#define Pi 3.1415926”以后的,所有代码中的“Pi”全部换成 “3.1415926”

然后再进行编译。

发表于 2006-4-17 20:48:15 | 显示全部楼层
如果说 #define 有优点的话,那就是不占用内存了,因为它是文本替换,不是声明变量,所以就更不是全局变量了
发表于 2006-4-17 22:49:22 | 显示全部楼层
说的有道理,不过还是不知道具体的区别
发表于 2006-6-9 13:28:31 | 显示全部楼层
#define 在宏定义上有着一些不可争辩的优势,但是做常数定义我觉得const可能会好一些。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 01:55

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表