GCC编译C语言常见错误和警告汇总

1.suggest parentheses around comparison in operand of '&' [-Wparentheses]

建议在'&'的操作数比较周围加上括号

警告语句

while(HWREG(PRCM_BASE_ADDR3 + CM_PER_SPI0_CLKCTRL) &
                CM_PER_SPI0_CLKCTRL_IDLEST
 != CM_PER_SPI0_CLKCTRL_IDLEST_FUNC);

解决这个警告就是在与运算操作的两边加上括号,修改为

while((HWREG(PRCM_BASE_ADDR3 + CM_PER_SPI0_CLKCTRL) &
                CM_PER_SPI0_CLKCTRL_IDLEST) != CM_PER_SPI0_CLKCTRL_IDLEST_FUNC);

2.suggest parentheses around '-' inside '>>' [-Wparentheses]

警告语句

Set = 0xFFFFFFFFu - (Period*(Time-DMTimerIsrExecTime)/Time)>>1;

解决这个警告就是在右移操作的两边加上括号修改为

Set = 0xFFFFFFFFu - ((Period*(Time-DMTimerIsrExecTime)/Time)>>1);

3.missing braces around initializer [-Wmissing-braces]

警告语句

typedef struct
{
    UINT8 data_suc_flag;        
    UINT16 data_len;       
    UINT16 rec_data[16384];     
}DATA_TYPE;

DATA_TYPE data[2]=
{
    1,    16384,  {65535,0,1,2,3}, 
    1,    16384,    {1,2,3,4,5,6}, 
};

这个警告是因为初始化缺少了大括号,使得初始化参数的分类不易区分,修改为

DATA_TYPE data[2]=
{
    {1,    16384,  {65535,0,1,2,3}},
    {1,    16384,    {1,2,3,4,5,6}}
};

4.a label can only be part of a statement and a declaration is not a statement 

报错的语句是"REC8030_ISOMDATA* pIsoM = (REC8030_ISOMDATA*)lpbyData;"

case INDEX_SUBSLOT_ISOCHRONOUSMODE:
       REC8030_ISOMDATA* pIsoM = (REC8030_ISOMDATA*)lpbyData;
       APP_DWORD Sub  = (APP_DWORD)ntohs(pIsoM->SubSlotNumber);
       APP_DWORD Slot = (APP_DWORD)ntohs(pIsoM->SlotNumber);
       //..........其余代码省略
      break;

因为switch中的几个case语句是同一作用域。所以如果在某个case下声明的变量,对象的作用域是两个{}之间,也就是整个switch语句,其他的case语句也有作用。可以在有变量声明的case语句中加入{}来表明声明的变量的作用域只在这个case。

修改如下

case INDEX_SUBSLOT_ISOCHRONOUSMODE:
     {
       REC8030_ISOMDATA* pIsoM = (REC8030_ISOMDATA*)lpbyData;
       APP_DWORD Sub  = (APP_DWORD)ntohs(pIsoM->SubSlotNumber);
       APP_DWORD Slot = (APP_DWORD)ntohs(pIsoM->SlotNumber);
       //..........其余代码省略
       break;
      }


版权声明:本文为zhouhongkun7原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。