关于MISRA C 2012规则18.8违规的整改建议咨询
MISRA C 2012规则18.8违规整改建议
问题分析
你的代码触发MISRA C 2012规则18.8,核心原因是:枚举常量HIGH不属于MISRA定义的整数常量表达式,而规则18.8要求数组大小必须是编译期可确定的整数常量表达式,不能依赖枚举这类非严格常量表达式定义数组大小。
整改方案
方案1:使用#define定义数组大小常量
宏是预处理器层面的常量,属于标准的整数常量表达式,完全符合MISRA要求:
#define LOW 0U #define HIGH 2U int main(void) { unsigned int A[HIGH] = {2U, 3U}; }
方案2:保留枚举但显式使用整数常量初始化数组
如果需要保留枚举类型,可直接使用对应整数值作为数组大小:
typedef enum NUMBER { LOW = 0, HIGH = 2 } NUMBER; int main(void) { unsigned int A[2U] = {2U, 3U}; }
方案3:使用const整数常量(需确认编译器支持)
部分编译器支持const限定的整数作为数组大小的常量表达式,写法如下:
typedef enum NUMBER { LOW = 0, HIGH = 2 } NUMBER; const unsigned int ARRAY_SIZE = HIGH; int main(void) { unsigned int A[ARRAY_SIZE] = {2U, 3U}; }
注意:此方案需确保编译器将
const变量视为编译期常量,部分严格遵循C标准的编译器可能不支持,优先推荐方案1。
内容的提问来源于stack exchange,提问作者Omar Messari
相关产品推荐
相关产品推荐

