#define与const

ELF文件通常拥有的段:
.text--------------已编译程序的机器代码
.rodata-----------只读数据
.data--------------已初始化的全局变量、局部静态变量。局部变量在运行时分配在相应栈帧中
.bss--------------未初始化的全局c变量、局部静态变量(不占据实际文件空间,记录大小信息,内存运行时分配)
.symtab----------一个符号表,存放定义和引用的函数和全局变量信息
.rel.text
.rel.tata-----------被模块引用或定义的任何全局变量的重定位信息
.debug
.line---------------c源程序与.text中机器指令之间行号映射
.strtab------------字符串表

首先静态数据存储空间:
const:编译完,空间分配在.rodata段,占存储空间。可获取地址。
#define:预编译完,替换代码中的宏定义(这说明直接就在代码段里面了)。如果时字符串字面常量,则占用 一个字符串大小的.rodata空间;如果时整形字面常量,不会分配静态数据存储空间。不可获取地址。

类型:
const:拥有数据类型,编译器可对其进行安全检查。
#define:无数据类型,只进行字符替换,没有类型安全检查。

作用局限:
const:常变量,虽然时不变的变量,但是本质还是变量,所以不能用以定义数组。
#define:可以用来定义数组,一般不用来获取地址

ps:
const修饰的常变量必须在定义时初始化:
const int temp;//错误
int *const temp;//错误
。。。
需不需要在定义时初始化看该变量在以后能不能被改变(当左值),如果不能必须初始化;如果可以则可不初始化。
const int *temp;//正确,因为temp可作为左值,只是*temp不能作为左值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值