微控制器编译器升级后变量与指针类型转换警告解决方案咨询
问题原因
升级后的编译器对指针的const、volatile限定符检查更严格,这才抛出了类型不匹配警告:
- 你定义的
buffer_t是双重volatile的指针:既要求指针本身是volatile,指向的内容也得是volatile(因为缓冲区要被ISR和主线程共享) - 传入的
string是普通的const unsigned char *,只是要求指向的内容不能被修改,没有volatile限定 - 旧编译器没严格卡这个规则,所以之前没警告
解决办法(不用改LCD库)
直接在调用i2c_write_buff的时候,给string做强制类型转换,匹配参数要求就行:
修改后的lcd_string函数:
void lcd_string(const unsigned char *string) { // 先把string转成带const和volatile的指针,再转成const buffer_t i2c_write_buff( (const buffer_t)(const volatile unsigned char *)string, lcd ); }
嫌麻烦的话,也可以用更简洁的写法,大部分编译器都能识别:
void lcd_string(const unsigned char *string) { i2c_write_buff( (const buffer_t)string, lcd ); }
为啥这么转没问题
const和volatile是可以一起用的,符合C语言规则i2c_write_buff只是读取字符串内容发出去,不会改你的字符串,所以转换不会出问题- 加
volatile是为了贴合buffer_t的定义,避免编译器对字符串内容做不必要的优化
内容的提问来源于stack exchange,提问作者Tay
相关产品推荐
相关产品推荐

