#define和const的区别
2024-08-28 22:51:51
下面使用#define和const定义常量:
#define n_define 10 int main(int argc, char* argv[],int _version)
{
const int n_const=;
int *p=(int *)&n_const;
*p=;
printf("%d",*p);
printf("\n%d",n_define); return ;
}
上述代码所对应的汇编代码如下:
mov [ebp+var_4], 14h ;n_const的十六进制
lea eax, [ebp+var_4]
mov [ebp+var_8], eax ;int *p=(int *)&n_const
mov ecx, [ebp+var_8]
mov dword ptr [ecx], 1Eh ;*p=30
mov edx, [ebp+var_8]
mov eax, [edx]
push eax
push offset asc_432020 ; "%"
call printf
add esp,
push 0Ah ;n_define的十六进制
push offset aD ; "\n%d"
call printf
add esp,
汇编代码1-11行对应C++代码5-8行。从汇编代码可以看得出来,在底层const常量和变量没区别。也就是说const定义的是假常量,本质上还是个变量,只不过编译器限制了我们对const常量的修改。而由#define定义的则不同。汇编代码第12行可以看出,编译器已经偷偷做了“手脚”:编译器将n_define替换成了0Ah,而这一步替换是发生在预处理阶段。n_define所对应的20已经变成了二进制,且在指令里面是属于立即数了。所以如果对n_define进行&n_define将会出错。
换一种通俗易懂的说法是:const常量是编译器级别的常量,而#define常量则是真常量。
最新文章
- 让IE8在win7下面能显示使用window.showmodaldialog弹出窗口的地址状态栏
- usb驱动开发18之设备生命线
- node基础07:写文件
- C语言用面向对象的思想写贪吃蛇
- Java——Selector
- Install FFMPEG and FFMPEG-PHP in CentOS 6 with Virtualmin
- STL源码--iterator和traits编程技法
- CRM 2013 系统设置新功能一:界面自动保存 及 SDK 中 Xrm.Page.data.entity.save
- Extjs利用vtype验证表单
- .net4.0下 解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误
- 三,对于printf函数和C语言编程的初步拓展
- 用Django搭建个人博客—(1)
- sf
- vs2008编译FileZilla客户端源码
- Struts2学习---基本配置,action,动态方法调用,action接收参数
- 洛谷P2387 [NOI2014]魔法森林(LCT,Splay)
- 为什么python运行的慢
- HttpWebRequest: Remote server returns error 503 Server Unavailable
- Ubuntu安装NVIDA显卡驱动
- JavaSE集合(八)之Map
热门文章
- 通过yum安装mysql
- django 之补充
- php提前输出响应及注意问题
- iOS学习笔记之正则表达式
- 如何理解python中的if __name__=='main'的作用
- Python爬虫之利用BeautifulSoup爬取豆瓣小说(三)——将小说信息写入文件
- JS中的“use strict” 严格模式
- this license has been cancelled
- C#中的索引器的简单理解和用法
- java关键字---final和transient