问答原贴连接:http://www.openedv.com/posts/list/7105.htm
最近在移植FATFS到STM32上出现了一个问题:
DRESULT disk_write (
BYTE drv, /* Physical drive nmuber (0..) */
const BYTE *buff, /* Data to be written */
DWORD sector, /* Sector address (LBA) */
BYTE count /* Number of sectors to write (1..255) */
)
{
// DRESULT res;
u8 result;
switch (drv) {
case MMC :
{
result = SD_WriteDisk((u8*)buff, sector, count);
// translate the reslut code here
}
}
return RES_PARERR;
SD_WriteDisk的原型 u8 SD_WriteDisk(u8*buf,u32 sector,u8 cnt);
请教下大家一个问题,为什么const BYTE *buff作为形参,SD_WriteDisk传进来的实参一定要是加(u8*)强制转换的呢(即(u8*)buff ),
不然编译不过提示 argument of type "const BYTE *" is incompatible with parameter of type "u8 *"
实在是不明白,请指教,谢谢!
编译器不允许你把常量当变量使用,
这样会导致安全性问题,
比如, SD_WriteDisk 函数内部可能会对 buf 指向的缓冲区进行写操作,但是如果 buf 是指向 code 区的常量,系统可能就会崩溃
如果 SD_WriteDisk 不对 buf 进行写入,函数又没定义成 SD_WriteDisk(u8 const* , ...),只能说这个函数定义的不够规范,自己改一下定义就行了。一般不进行写入的量,都应该定义成 const,这样自己犯错的概率会小一点(相信调过程序的人都是坚信人一定会犯错的,所以尽管有些微不足道的东西,也应该养成个好习惯),也比较规范。