目录
相关文章如下:
10、《MISRA C-2012准则之表达式》
一、MISRA C简介
MISRA C是由汽车产业软件可靠性协会(MISRA)提出的C语言开发标准。其目的是在增进嵌入式系统的安全性及可移植性。
MISRA C一开始主要是针对汽车产业,不过其它产业也逐渐开始使用MISRA C:包括航天、电信、 国防、医疗设备、铁路等领域中都已有厂商使用MISRA C。
MISRA C的第一版是在1998年发行,一般称为MISRA-C:1998。在2004年时发行了第二版的MISRA C,称作MISRA-C:2004。2012年发布第三版,为当前最新有效的C语言规范版本,称为MISRA-C:2012。 MISRA C不能100%保证程序不出问题,但是能尽可能的预防,总结一下,基本上使用MISRA C具有以下五个维度的优势:
1、提升可靠性
2、提升可读性
3、提升可移植性
4、提升可维护性
5、提升安全性
二、初始化
2.1、正确的初始化示例
2.1.1、自动变量初始化
int main() {
int a = 0; // 强制初始化
float b = 0.0f;
char c = '\0';
return 0;
}
2.1.2、结构体初始化
struct Point {
int x;
int y;
};
int main() {
struct Point p = {0, 0}; // 必需在大括号内初始化
return 0;
}
2.1.3、数组初始化
int main() {
int arr[5] = {0}; // 全部初始化为0
int arr2[3] = {1, 2, 3}; // 明确指定大小并完全初始化
return 0;
}
2.1.4、联合体初始化
union Data {
int i;
float f;
};
int main() {
union Data d = {0}; // 初始化第一个成员
return 0;
}
2.2、错误示例
2.2.1、未初始化的自动变量
int main() {
int a; // 错误:使用前未初始化
printf("%d", a);
return 0;
}
2.2.2、结构体部分初始化
struct Point {
int x;
int y;
};
int main() {
struct Point p = {0}; // 错误:只初始化了x,y未初始化
return 0;
}
2.2.3、数组部分初始化
int main() {
int arr[5] = {1, 2}; // 错误:部分初始化
return 0;
}
2.2.4、重复初始化
int main() {
int a = 0;
a = 1; // 错误:重复初始化(如果a已经通过声明初始化过)
return 0;
}
2.2.5、未指定大小的数组初始化
int main() {
int arr[] = {1, 2, 3}; // 错误:未明确指定大小(虽然编译器会推断,但不符合规范)
return 0;
}
三、注意事项
- 在C99及以上版本中,可以使用
int arr[] = {1, 2, 3};
让编译器推断数组大小,但严格遵循规范时应明确指定大小。 - 结构体和联合体的初始化必须包含所有成员或明确指定初始化的成员。
- 避免在初始化后再次为同一变量赋值,除非有明确的逻辑需求。