#define和const的问题(优缺点!)

ch_tei_hyou 2009-07-24 11:57:43
我知道#define和const 相比有如下劣势:

1.const定义常量是有数据类型的,而#define宏定义常量却没有

2.const常量有数据类型,而宏常量没有数据类型。编译器可以对const进行类型安全检查,
而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误

3.有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
__________________________________________________

请问:(每个问题10分总共40分)(如果有相应资料可以的话请提供一下)

1.还有其他的劣势么,是什么导致c++要求用const取代#define,有参考文档么?原理?

2.既然有这样那样的劣势,c为什么不要求用const取代#define?

3.#define的优势是是什么?

4.const的劣势是什么?
...全文
3058 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjz19901211 2010-11-22
  • 打赏
  • 举报
回复
正好有点疑惑,呵呵学习了。
jenglev 2009-07-24
  • 打赏
  • 举报
回复
const有作用域的限制,define却没有。各有优缺点,不要想着谁取代谁。
china0008 2009-07-24
  • 打赏
  • 举报
回复
从来都没有考虑过这个问题。楼主一问发现自己学的还是不够透彻。研究去了。搞明白他。
ies_sweet 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 ch_tei_hyou 的回复:]

1.还有其他的劣势么,是什么导致c++要求用const取代#define,有参考文档么?原理?
[/Quote]

无论是const还是#define,都是帮助编译器/预处理器 来生成可执行程序的。
用const引入数据类型后,可以帮助编译器识别数据的“属性”,这对编译器是非常重要的
有兴趣的话可以简单看一下编译原理。
#define是预处理阶段的工作,和编译器无关了。

[Quote=引用楼主 ch_tei_hyou 的回复:]
2.既然有这样那样的劣势,c为什么不要求用const取代#define?
[/Quote]

要知道,一门语言是有标准的,而且要求标准的稳定。如果在C中加入太多的C++特性,将会
导致C编译器前端过于庞大,这就丧失了C的一些优势。
如果C还有存在的道理,保持自己的简洁、小巧是必须的。
C标准委员会没有接纳这1点,很遗憾。

[Quote=引用楼主 ch_tei_hyou 的回复:]
3.#define的优势是是什么?
[/Quote]

从写编译器的角度讲,最大的优势是简单。因为预处理就可以解决掉#define,
不必让编译器来处理这个。

从应用上讲,#define也是不可或缺的。因为它可以让写代码的人体会到方便性。

[Quote=引用楼主 ch_tei_hyou 的回复:]
4.const的劣势是什么?
[/Quote]

世界上没有不好的资源,只有不会利用好好利用资源的人。
const很好,可以让编译器帮助我们做更多的事情,
但是真正理解const含义,有几人?
能用好const的,有几人?
有些东西,如果用不好,还不如不用……
emacsnw 2009-07-24
  • 打赏
  • 举报
回复
第三问:define不仅是定义常量,还可以定义带参数的宏,做到一定程度的泛型(利用#或者##操作符)。
lingyin55 2009-07-24
  • 打赏
  • 举报
回复
http://hi.baidu.com/lizuoqin/blog/item/685d9a86b15b283a67096e82.html
Fleeboy 2009-07-24
  • 打赏
  • 举报
回复
楼主已经了解得很好了:)
  • 打赏
  • 举报
回复
up 学习
udsking 2009-07-24
  • 打赏
  • 举报
回复
推荐一本小册子:<C语言深度剖析>,陈正冲编著的,看完之后你就全能理解了!
hoomey 2009-07-24
  • 打赏
  • 举报
回复
上面分析的都不错
qinlang007 2009-07-24
  • 打赏
  • 举报
回复
effective c++ 看过没,上面分析的很透侧!~~
zgjxwl 2009-07-24
  • 打赏
  • 举报
回复
2. C99的标准,已经增加了const的关键字了.也就是说现在const并非C++专有,在C语言中也可以使用 const代替 define定义一些常量了.

C99标准没看过。。
飞天御剑流 2009-07-24
  • 打赏
  • 举报
回复
楼上,最大的问题,是还没有弄清楚什么是标准,什么是实现。
billow_zhang 2009-07-24
  • 打赏
  • 举报
回复
回10楼:
关于分配空间到问题:
加入,你只是引用常量,比如:

const int ival = 20;

int vval = ival;

那么, 程序是不会分配空间的. 因为,我们知道,const int ival = 20; 这样的语句是可以放在头文件内被多个.c程序包含使用的.如果是分配了空间的话,那当包含同样头文件的多个.c文件链接的时候,就会出现变量重复定义的错误.

但是,当你使用了 ival的地址的时候,比如:
int *pval = &ival;

这个时候,程序是会分配空间的. 所以,在这个问题上,不存在所谓,defien语句比const效率高的问题.

C语言的精悍,在于可以使得程序员写出精悍的程序. 而增加一个const并不会改变C的语言结构,怎么会影响它的精悍.

所谓,C的要求const替代#define语句的问题. 那是因为,C的程序出现过早, 有太多的程序是在C99规范之前的程序,当然,就不能使用const了. 并且,现在还有部分编译器未实现C99的标准,也可能不能使用 const. 但在今后的趋势下, 即使是C语言, 还是在能够使用const的地方,推荐使用const, 而不使用define. 如果硬要说,它有什么缺点的话,那就是,它会检查程序的数据类型使用,使得编译时间增加,但绝不会影响运行效率.所以,从运行的角度来说,它完全没有效率问题,也不会增加运行代码,影响程序的短小精悍.

在C++中也没有一定要使用const的要求,也可以使用define语句啊.

应该说,define语句的复杂定义和不检查类型的特点是有害的.所以, 应该尽量使用const替代define. 无论是C还是C++, 都是这样的. 只不过,要是为了考虑兼容那些没有实现const编译器的要求,在C中可以考虑不使用 const.

ch_tei_hyou 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 billow_zhang 的回复:]
1. C++并非使用const取代define,而只是增加了const. 具体使用const定义替代define定义的好处,楼主已经基本了解了,我就不罗嗦了. 需要补充的是:  define是应用于预处理的,而const是在编译的时候处理的.
[/Quote]
我认为,#define在预处理阶段完成使命,使它没有为数据分配空间,这样能使效率更高,
所以,应该不算是劣势,反而应该算是优势.

如果说,const出现是为了弥补#define的不足的话,至少这一点优点没有被继承,

也许这是c为了保持其短小精悍的优势,而没有用const替换#define。至少,我很少看到c要求用const替换#define的,
而c++则有这个要求,是语言的特性决定的吧。c++有inline。。。有模版。。。所以#define的作用和优势就不是特别的明显了,对吧。
飞天御剑流 2009-07-24
  • 打赏
  • 举报
回复
1.还有其他的劣势么,是什么导致c++要求用const取代#define,有参考文档么?原理?
2.既然有这样那样的劣势,c为什么不要求用const取代#define?
3.#define的优势是是什么?
4.const的劣势是什么?
-------------------------------------
const相比#define的优点其实主要就两点,一是const有类型;二是const可以有不同的作用域。

此外,宏的主体是语言符号,它对于字符串的观点跟c/c++的字符串字面量是很不一样的,这会在使用中

给程序员带来一些意想不到的问题。

const不足的地方,是与生俱来的,const不能重定义,而宏可以通过#undef取消某个符号的定义,再重新定义。

c89开始已经有const了,但c之所以提倡用#define,是由于c与c++对常量表达式的定义是不同的。

在c中,常量表达式必须是编译期常量,不能是运行期的,而c++对此没有限定。这会带来如下的问题:


在c中,这样的代码是错误的:

const int i = 20;
int a[i];

但在c++中是正确的。

原因就在于上述i是一个运行期常量,在c中不是常量表达式,因此c才提倡使用#define。

摘录C的标准:


6.6 Constant expressions
..........
A constant expression can be evaluated during translation rather than runtime, and
accordingly may be used in any place that a constant may be.



billow_zhang 2009-07-24
  • 打赏
  • 举报
回复
1. C++并非使用const取代define,而只是增加了const. 具体使用const定义替代define定义的好处,楼主已经基本了解了,我就不罗嗦了. 需要补充的是: define是应用于预处理的,而const是在编译的时候处理的.

2. C99的标准,已经增加了const的关键字了.也就是说现在const并非C++专有,在C语言中也可以使用 const代替 define定义一些常量了.

3. 对于一些编译选项等,还是需要define语句.例如:
# define DEBUG

# ifdef DEBUG
.....
# endif
使用 define 语句还可以利用预处理的功能,进行一些灵活的定义,见下面的例子:

# define Invalid 1
# define Notfound 2

# define def_value(name) { name, #name }

struct {
int code;
char *name;
} map_table[] = {
def_value(Invalid),
def_value(Notfound),
};

4. 在程序语句中使用的常量的地方, 最好是使用const定义,在这方面来说, const只有优势,没有劣势.如果要说const劣势的地方,那就是它不能做上面3中的define的需要在预处理的时候做的事情.其实,这并非它的劣势,而只是不是它所要担负的工作罢了.

楼主的问题有些把define与const对立起来了. 它们是各有各的职责和任务.
mengjfu 2009-07-24
  • 打赏
  • 举报
回复
1.差别:

const与#define最大的差别在于:前者在堆栈分配了空间,而后者只是把具体数值直接传递到目标变量罢了。或者说,const的常量是一个Run-Time的概念,他在程序中确确实实的存在可以被调用、传递。而#define常量则是一个Compile-Time概念,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参数,没有实际的存在。

另外const可以指定数据类型,#define不行。

const常量存在于程序的数据段.

#define常量存在于程序的代码段。

2优缺点:

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

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

但是:如果你需要粗鲁的修改常数的值,那就的使用const了,因为后者在程序中没有实际的存在.

另外在头文件中使用 #define 可以避免头文件重复包含的问题,这个功能,是const无法取代的。

1) 本套课程针对高校大学生系统学习C语言而录制,从0基础入门讲起,循序渐进,通俗易懂,同时适用于计算机系及非计算机系的同学。通过学习可以帮助大家掌握C语言本质,轻松面对C语言全国二级考试,并达到能独立完成中型C项目、C游戏的水平;2) 多数高校都开设了C语言课程,网上C语言课程也很多,但普遍存在两个问题: (1) 授课方式单一,大多是照着代码念一遍, 对刚刚接触编程的同学来说,感觉晦涩难懂 (2) 授课内容过度注重语法,没有项目实战支撑,造成课程枯燥无趣。本课程针对上述问题进行了改进 (1) 授课方式采用语法讲解+内存布局示意图+项目的方式,让课程生动有趣好理解 (2) 系统全面的讲解了C语言的核心技术点,还配套录制了《全国计算机二级C语言真题精讲》,让学员在掌握C语言编程的同时,还能轻松面对二级考试;3) 课程详细内容: 常量-变量、分支语句、循环语句、操作符和表达式、函数(库函数、自定义函数、递归调用 )、数组(一维数 组、二维数组、数组作为函数参数、指针数组)、指针(指针和指针类型、二级指针和多级指针、指针表达式解析、指针运算、数 组指针、函数指针、回调函数)、调试技巧、程序环境和预处理(翻译环境、运行环境、预定义符号、#define和#undef、宏和函 数、条件编译、文件包含)、 数据在内存中的存储、内存块分配、static、字符函数和字符串函数、自定义类型(结构体、枚举 、联合)、动态内存管理、文件操作(i/o常量、i/o函数、流)。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧