博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言define 与const
阅读量:2431 次
发布时间:2019-05-10

本文共 1443 字,大约阅读时间需要 4 分钟。

前言:最近看到一篇比较详细的描写C语言之const与define区别对的博文,经博主同意转发分享一哈

define 与const

符号变量define是预编译指令,在预编译的时候仅仅进行字符替换,预编译后符号常量就不存在了,例如define PI 3.1415926 ,编译以后就不存在PI了,所有的PI都被换成了3.1415926。而且PI没有存储单元。而常变量const变量要占用存储单元,有变量值,只是值不能改,它有符号变量的优点,而且比较方便。其实还有一个static,不过这是C语言,就不说它了。
具体可以分为:
(1)const定义的常数带类型,define不带类型,
(2)const是在 编译、运行的时候起作用,而define是在编译的预处理阶段起作用。
(3)define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
define只是简单的字符串替换会导致边界效应,比如定义
#define A 1
#define B A+3
#define C A/B3
那么c是多少呢?c=A/B
3=A/A+33=1/1+33=10;
所以这种用的时候可以直接都用个括号括起来,就不怕边界效应了。
(4)define预处理后占用代码空间,而const占用数据段空间。
(5) const常量可以进行调试的,define是不能进行调试的,主要是预编译阶段就已经替换掉了,调试的时候就没它了。
(6)const不能重定义,不可以定义两个一样的,而define就比较牛气了,它通过undef取消某个符号的定义,再重新定义。
(7) define可以用来防止头文件重复引用,而const不能。举例:

#ifndef GRAPHICS_H // 防止graphics.h被重复引用

#define GRAPHICS_H
……代码……
#endif

这里要说一下有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情;有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量这种会引起重复定义

,虽然C规范允许,但是不推荐这样用啊。

(8)使用define会使得代码看起来非常简单,而const无法实现该功能

例如,MFC在实现六大核心机制中,大量使用了define
1、MFC程序的初始化
2、运行时类型识别(RTTI)
3、动态创建
4、永久保存
5、消息映射
6、消息传递
define和const直接的区别在某个点上同C语言与JAVA语言有一定的相似性:
(1) JAVA中内部对象高度封装,比如对于内存的回收机制而言更是自动完成,不需要程序员多费心;而C语言中,每次我们用指针申请一段空间时,我们都需要仔细考虑,这个指针后面会不会还要使用,现在是不是可以释放了,会不会成为野指针等等问题,所有的内存相关问题都需要程序员自己考虑,但是好处是,C语言可以直接方便的操作内存,这是一把双刃剑,用得好事半功倍,用得不好,内存泄漏,指针跑飞,问题到处都是。
(2) C语言和JAVA语言的差异点类比到define和const,要强调的是define的作用非常强大,虽然它没有类型检测,不能调试,还要考虑边界效应,但是正因为没有类型检测,预编译是就完成,才使得它的使用更加灵活,功能更加强大。

作者:Love_Cpp_forever

原文:

转载地址:http://gptmb.baihongyu.com/

你可能感兴趣的文章
Oracle安装指南
查看>>
Redis面试必备(一)
查看>>
Cookie对象入门详解
查看>>
HashMap的remove()方法详解
查看>>
单例模式-分解步骤,逐步解析
查看>>
通过Form表单一次性拿到json格式数据,及后台接收
查看>>
## EL表达式与JSTL标签用法解读
查看>>
Mybatis异常:The content of elements must consist of well-formed.......(一般出现在写分页/带大于小于号的SQL)
查看>>
Mybatis光速入门(配置文件模块)
查看>>
关于Oracle的主键自增如何设置
查看>>
手撕HashMap的resize()方法源码渗透解析+图解
查看>>
Mybatis常见异常类型Could not set parameters for mapping离不开这个原因!
查看>>
Thymeleaf中一个页面怎么嵌套另一个页面,关于页面嵌套,标签告诉你应该知道的
查看>>
JAVA如何实现短信验证码--阿里云接口,新手式图文教学,个人项目有这一篇就够了
查看>>
Java中大小数BigDecimal的加减乘除用法及场景的详细介绍,看完不信你还会报Syntax error on token “+/-/*“, invalid AssignmentOperat异常
查看>>
UVa 10917 Dijkstra
查看>>
CF403B/CF402D
查看>>
CF402E / 403C
查看>>
cf404b
查看>>
cf404c
查看>>