STM32 C代码编译Proc_Start第3参数指针符号不匹配警告问题
STM32 C代码
signedness指针编译警告解决方案 问题现象
编译STM32目标平台的C代码时抛出如下警告,搜索通用同类问题解决方案无效:
warning: pointer targets in passing argument 3 of 'Proc_Start' differ in signedness
相关代码片段
警告触发位置代码
void AppGestRelay_Init(u8 u8lvoie) { //Init Dac value for alim u16 u16lDacValue = (((41435.4-Param.vcoil[u8lvoie])/16376.2)/2.48)*1024; DrDac_SetValueChip(u8lvoie+1, u16lDacValue); //Init discharge mode mProcStartParam(AppGestRelay_DischargeMode, &u8lvoie); //test TrackAlt[TRACK1] = ALTER_POS; TrackRunning[u8lvoie] = TRACK_NOT; }
原始宏定义
#define mProcStart(fonct) Proc_Start(fonct, NULL, (const s8*)#fonct) #define mProcStartParam(fonct,param) Proc_Start(fonct, (TProcParam)(param), #fonct)
被调用业务函数代码
P_PROC(AppGestRelay_DischargeMode) { static u8 u8lvoie; P_BEGIN; u8lvoie = *(u8*)P_PARAM; if(TRUE == Param.zener[u8lvoie]) { PcfDataW.pin7[u8lvoie] = PIN_OFF; printf("on\r"); P_DELAY(mTICK_MS(10)); PcfDataW.pin7[u8lvoie] = PIN_ON; printf("off\r"); } else { PcfDataW.pin6[u8lvoie] = PIN_OFF; printf("on\r"); P_DELAY(mTICK_MS(10)); PcfDataW.pin6[u8lvoie] = PIN_ON; printf("off\r"); } P_EXIT(); P_CLEANUP; P_END; }
解决方案
踩坑记录
- 尝试手动给
mProcStartParam传第三个参数,直接触发宏参数数量不匹配的编译错误,该宏本身仅设计为接收2个入参 - 调整
AppGestRelay_Init的业务逻辑可正常运行程序,但编译警告始终存在
最终修复方案
参考同系列mProcStart宏的类型转换逻辑,给mProcStartParam宏的第三个参数增加const s8*强制类型转换即可完全消除警告,修改后的宏定义如下:
#define mProcStartParam(fonct,param) Proc_Start(fonct, (TProcParam)(param), (const s8*) #fonct)
警告根因说明
C标准中字符串字面量的默认类型为const char *,而Proc_Start函数的第三个形参要求入参类型为const s8 *;嵌入式场景中s8通常被定义为signed char,ARM GCC等STM32常用编译工具链默认配置下char为无符号类型,两者指针的符号属性不匹配就会抛出该signedness类警告。原始的mProcStart宏已经做了适配转换,属于mProcStartParam宏封装时的参数处理疏漏。
内容的提问来源于stack exchange,提问作者Snorny
相关产品推荐
相关产品推荐

