搜索
bottom↓
回复: 8

常量、变量做函数参数,在变量不变情况下感觉没区别。

[复制链接]

出0入27汤圆

发表于 2019-8-21 16:47:30 | 显示全部楼层 |阅读模式
本帖最后由 neutronlmk 于 2019-8-21 20:17 编辑

常量做参数
  1. void FT25Hxx_EraseSector(const uint32_t fu32_Address)
  2. {
  3.     FT25Hxx_WriteEnable();                          //FT25Hxx写使能
  4.     FT25Hxx_CS = 0;                                 //使能器件
  5.     SPI_WriteReadData(0x20);
  6.     SPI_WriteReadData((uint8_t)(fu32_Address>>16)); //发送地址
  7.     SPI_WriteReadData((uint8_t)(fu32_Address>>8));
  8.     SPI_WriteReadData((uint8_t)(fu32_Address));
  9.     FT25Hxx_CS = 1;                                 //取消片选
  10.     FT25Hxx_WaitBusy();                             //等待写入结束
  11. }
复制代码
变量做参数:
  1. void FT25Hxx_EraseSector(uint32_t fu32_Address)
  2. {
  3.     FT25Hxx_WriteEnable();                          //FT25Hxx写使能
  4.     FT25Hxx_CS = 0;                                 //使能器件
  5.     SPI_WriteReadData(0x20);
  6.     SPI_WriteReadData((uint8_t)(fu32_Address>>16)); //发送地址
  7.     SPI_WriteReadData((uint8_t)(fu32_Address>>8));
  8.     SPI_WriteReadData((uint8_t)(fu32_Address));
  9.     FT25Hxx_CS = 1;                                 //取消片选
  10.     FT25Hxx_WaitBusy();                             //等待写入结束
  11. }
复制代码
编译输出大小不变,使用的ram也不变。
这该如何决择?

增加一个:
  1. void FT25Hxx_ReadRDID(uint8_t *fu8p_SaveArr)
  2. {
  3.     uint8_t u8_i;
  4.    
  5.     FT25Hxx_CS = 0;                                 //使能器件
  6.     SPI_WriteReadData(0x9F);                        //发送读取RDID命令
  7.     SPI_WriteReadData(0x00);                        //发送24bit地址  
  8.     SPI_WriteReadData(0x00);
  9.     SPI_WriteReadData(0x00);
  10.     for(u8_i=0;u8_i<3;u8_i++)
  11.     {
  12.         fu8p_SaveArr[u8_i]=SPI_WriteReadData(0xFF); //循环读数
  13.     }
  14.     FT25Hxx_CS = 1;                                 //取消片选
  15. }
复制代码

fu8p_SaveArr是否有必要声明为 uint8_t *const fu8p_SaveArr ?
我试过编译OK。


出0入0汤圆

发表于 2019-8-21 17:00:46 | 显示全部楼层
const 改为code 试试

出0入0汤圆

发表于 2019-8-21 17:15:47 | 显示全部楼层
const不仅在语义上提醒不要修改,更是从编译器级别保证不会被误修改;
以lz位代码为例,如果函数代码中不小心修改了fu32_Address的值,前者会在编译时立刻报错发现,后者则会在运行时得到错误的结果(擦除错误的扇区、而且也许不会立即被发现)。

出0入0汤圆

发表于 2019-8-21 17:21:54 | 显示全部楼层
这不很正常嘛,const主要就是给编译器检查用的,你没违背const的限制,就不会报错而已,生成的代码当然是一样的。内存和CPU又不管只读不只读的

出0入0汤圆

发表于 2019-8-21 17:31:39 | 显示全部楼层
好奇,测了一下,好像真没区别。

出0入27汤圆

 楼主| 发表于 2019-8-21 19:57:12 | 显示全部楼层
jathenal 发表于 2019-8-21 17:15
const不仅在语义上提醒不要修改,更是从编译器级别保证不会被误修改;
以lz位代码为例,如果函数代码中不小 ...

感谢感谢

出0入0汤圆

发表于 2019-8-21 20:46:32 | 显示全部楼层
const代表在本函数范围内值是不能修改的

出0入0汤圆

发表于 2019-8-22 08:34:29 | 显示全部楼层
哈哈,真逗

出0入8汤圆

发表于 2019-8-22 08:38:21 | 显示全部楼层
你好,金牌会员。。。这能说明系统性的看完一本C语言书的必要性吗
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 16:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表