stc32编译警告是什么原因
本帖最后由 jingboxu 于 2023-3-3 11:13 编辑在官方演示程序中“37-2.4寸ILI9341驱动TFT显示屏实验程序“编译报告警告
..\GUI\gui.c(469): warning C188: 'parameter 2': value truncated
..\GUI\gui.c(479): warning C188: 'parameter 5': value truncated
请教这个是官方演示程序中的编译时警告是什么原因?
提示传递参数类型跟函数定义不一致,参数内容可能会被截取。
例如将16位变量传递给8位类型参数的函数,那么高8位数据被截取,只传递低8位数据到函数。 关于C188警告的详细测试程序段, 按照指示添加并编译后就可以在KEIL C251中进行软件仿真测试(ctrl+F5):
显示强制类型转换操作 可以消除 C188 告警,但是使用者需要自己当心转换中数据截断操作是否满足自己的要求!
//将以下程序行添加到一个C251工程中的 main.c 中的 #include <xxx>之后,且是main()函数之外
//变量定义
u8 u8_i, u8_k;
u16 u16_k;
//函数声明
u8 add_x_y(u8 x);
u16 add1_x_y(u16 x);
//函数代码
u8 add_x_y(u8 x)
{
return(x+1);
}
u16 add1_x_y(u16 x)
{
return(x+1);
}
//将以下程序行添加到一个C251工程中的 main()函数中的 RSTFLAG |= 0x04; 之后
//测试 L188 的程序段
u8_i = 1;
u8_k = add_x_y(u8_i+1); //这里回产生 C188 编译警告, 是因为C251编译器默认是常数 1 为 双字节类型,而函数调用定义的参数类型是u8,存在数据截断,故产生警告!
//运行结果u8_k =3 正确
u8_k = add_x_y((u8)(u8_i+1)); //这里对(u8_i+1)先行进行显式强制类型转换,则不会产生 C188 编译警告
//运行结果u8_k =3 正确
u8_i = 1;
u16_k = add1_x_y(u8_i+0x1234L); //这里参数值相加后有效数值实际也是u16类型,不会产生数据字节的截断,则 不 会产生 C188 编译警告
//运行结果u16_k =0x1236 正确
u16_k = add1_x_y(u8_i+0x12345678L); //这里参数值相加后已经是4字节,而函数调用定义的参数类型是u16,存在数据截断,故产生 C188 警告!
//运行结果u16_k =0x567A 正确
u16_k = add1_x_y((u16)(u8_i+0x12345678L)); //这里参数值相加后已经是4字节,而函数调用定义的参数类型是u16,由于存在显式强制类型转换,则不会产生 C188 编译警告
//运行结果u16_k =0x567A 正确
////
//END OF ALL 我也遇到了和UP同样的问题,按几位的方法,我也修改成功了。{:victory:}
机灵小老鼠 发表于 2023-7-9 09:29
关于C188警告的详细测试程序段, 按照指示添加并编译后就可以在KEIL C251中进行软件仿真测试(ctrl+F5):
显 ...
用实例证明:这样分析的非常仔细,点赞点赞 强制转换有效,不知道,如果不管会不会出现什么bug。
强制转换前,137行会报警告
137行强制转换后,消除了137行的警告
今天也遇到同样的问题。根据楼上的方法找到警告原因。非常感谢! 可以用#pragma warning disable = 188 在头文件里来屏蔽这个警告,我移植个东西报100多个这玩意儿给我整崩溃了
页:
[1]