完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
const是用来定义常量的,在编译后应该是一个确定值的常量,并且在定义时应加上数据类型。而#defin则是用来做符号替换。
如:const int a=3;表示a的值为整型常量3. #defin a 3表示你写的c或是h文件中的a会被3取代。 那么const怎样使用能更好的优化代码呢? 下面是STC的定时器例程: /*------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------------------------------------*/ /* --- STC89-90xx Series 16-bit timer Demo -------------------------*/ /* --- Mobile: (86)13922805190 -------------------------------------*/ /* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/ /* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------*/ /* --- Web: www.GXWMCU.com -----------------------------------------*/ /* If you want to use the program or the program referenced in the */ /* article, please specify in which data and procedures from STC */ /*------------------------------------------------------------------*/ #include "reg51.h" typedef unsigned char BYTE; typedef unsigned int WORD; //----------------------------------------------- /* define constants */ #define FOSC 11059200L #define T1MS (65536-FOSC/12/1000) //1ms timer calculation method in 12T mode /* define SFR */ ***it TEST_LED = P1^0; //work LED, flash once per second /* define variables */ WORD count; //1000 times counter //----------------------------------------------- /* Timer0 interrupt routine */ void tm0_isr() interrupt 1 using 1 { TL0 = T1MS; //reload timer0 low byte TH0 = T1MS >> 8; //reload timer0 high byte if (count-- == 0) //1ms * 1000 -> 1s { count = 1000; //reset counter TEST_LED = ! TEST_LED; //work LED flash } } //----------------------------------------------- /* main program */ void main() { TMOD = 0x01; //set timer0 as mode1 (16-bit) TL0 = T1MS; //initial timer0 low byte TH0 = T1MS >> 8; //initial timer0 high byte TR0 = 1; //timer0 start running ET0 = 1; //enable timer0 interrupt EA = 1; //open global interrupt switch count = 0; //initial counter while (1); //loop } 编译后生成代码量:Program Size: data=19.0 xdata=0 code=79 但是这里面 T1MS 会被(65536-11059200L/12/1000)取代,这样虽然生成的代码量小,但程序运行过程中占用CPU时间很多, 我们更改一下代码,把代码改成如下: /* define constants */ #define FOSC 11059200L const int T1MS=(65536-FOSC/12/1000); //#define T1MS (65536-FOSC/12/1000) //1ms timer calculation method in 12T mode 再生成的代码量:Program Size: data=21.0 xdata=0 code=216 我们再更改一下代码,把代码改成如下: /* define constants */ #define FOSC 11059200L const int T1MS=921;//(65536-FOSC/12/1000); //#define T1MS (65536-FOSC/12/1000) //1ms timer calculation method in 12T mode 再生成的代码量:Program Size: data=21.0 xdata=0 code=216 证明T1MS在编译过程中已经把921给计算出来并将其代入程序内了。 这样的话T1MS就不会在程序里面再进行计算,从而减少了运行时间。 |
|
相关推荐
5个回答
|
|
|
|
|
|
你的意思在这里用CONST没有意义?
|
|
|
|
首先,const定义的是变量,虽然不能改变,但他还是变量,宏定义的是立即数,这个在预处理的时候就被编译器替换了,你看一下对应的汇编就知道了,是两个不同概念的东西。另外,在51里定义在ROM里的不变的数据一般用CODE关键字。
|
|
|
|
code的数据是存在程序空间,不占用内存,const的数据是初始化存在内存中,从汇编哪里到const和#defin都成了立即数,但优化等级高的情况下#defin容易出现程序乱跳,请问这是什么原因
|
|
|
|
#difine 和优化没有一点关系,严格讲,宏定义甚至都不是C语言的一部分,但是用define要主要不要和其他的部分相互作用产生异议,好的习惯是加一个括号。
另外,你CONST定义也是要占用ROM的,既然不改了,就只占用ROM好了。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9000 浏览 16 评论
4051 浏览 18 评论
1110浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
569浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2302浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 19:09 , Processed in 1.158678 second(s), Total 56, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号