MISRA C-2012准则之声明与定义

目录

一、MISRA C简介

二、声明与定义

1. 必需。类型应被显式声明。

2. 必需。函数应以原型形式命名参数。

3. 必需。所有对象和函数的声明需要使用完全相同的名字和参数。

4. 必需。当定义有外部链接的对象或函数时,兼容声明应是可见的。

5. 必需。外部变量或函数应被在仅一个文件内被声明过。

6. 必需。有外部链接的标识符应有一个确切的外部定义。

7. 建议。若函数和对象仅被一个单元引用,最好不定义外部链接。

8. 必需。静态存储类说明符应在所有具有内部链接的对象和函数的声明中使用。

9. 建议。如果一个对象的标识符仅在一个函数内出现,该对象应被定义在块范围内。

10. 必需。内联函数定义时应用静态存储类声明。

11. 建议。当有外部链接的数组被定义,应显式指定其大小。

12. 必需。枚举列表内的枚举值应独一无二。

13. 建议。指针最好指向一个const类型的变量。

14. 必需。不得使用restrict限定词。


 相关文章如下:

1、《MISRA C-2012准则之标准C环境准则

2、《MISRA C-2012准则之未使用的代码的处理

3、《MISRA C-2012准则之注释

4、《MISRA C-2012准则之标识符

5、《MISRA C-2012准则之常量

6、《MISRA C-2012准则之声明与定义

7、《MISRA C-2012准则之初始化

8、《MISRA C-2012准则之基本数据类型

9、《MISRA C-2012准则之指针类型转换

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、提升安全性

二、声明与定义

必需。类型应被显式声明。

必需。函数应以原型形式命名参数。

必需。所有对象和函数的声明需要使用完全相同的名字和参数。

必需。当定义有外部链接的对象或函数时,兼容声明应是可见的。、

必需。外部变量或函数应被在仅一个文件内被声明过。

必需。有外部链接的标识符应有一个确切的外部定义。

建议。若函数和对象仅被一个单元引用,最好不定义外部链接。

必需。静态存储类说明符应在所有具有内部链接的对象和函数的声明中使用。

建议。如果一个对象的标识符仅在一个函数内出现,该对象应被定义在块范围内。

必需。内联函数定义时应用静态存储类声明。

建议。当有外部链接的数组被定义,应显式指定其大小。

必需。枚举列表内的枚举值应独一无二。

建议。指针最好指向一个const类型的变量。

必需。不得使用restrict限定词。

1. 必需。类型应被显式声明

#include <stdio.h>int main() {a = 10; // 错误:变量a未显式声明printf("%d\n", a);return 0;
}

2. 必需。函数应以原型形式命名参数

#include <stdio.h>int add(); // 错误:函数原型未命名参数int main() {printf("%d\n", add(5, 3));return 0;
}int add(int a, int b) {return a + b;
}

3. 必需。所有对象和函数的声明需要使用完全相同的名字和参数

#include <stdio.h>int func(int a); // 声明
int func(float a); // 错误:函数声明参数类型不一致int main() {printf("%d\n", func(5));return 0;
}int func(int a) {return a;
}

4. 必需。当定义有外部链接的对象或函数时,兼容声明应是可见的

#include <stdio.h>int globalVar; // 声明int main() {printf("%d\n", globalVar);return 0;
}// 错误:外部变量globalVar的定义不可见
// int globalVar = 10;

5. 必需。外部变量或函数应被在仅一个文件内被声明过

// file1.c
int globalVar = 10;// file2.c
#include <stdio.h>int main() {printf("%d\n", globalVar);return 0;
}// 错误:globalVar在多个文件中定义
// int globalVar = 20;

6. 必需。有外部链接的标识符应有一个确切的外部定义

#include <stdio.h>int globalVar; // 声明int main() {printf("%d\n", globalVar);return 0;
}// 错误:globalVar没有外部定义

7. 建议。若函数和对象仅被一个单元引用,最好不定义外部链接

#include <stdio.h>int globalVar = 10; // 外部链接int main() {printf("%d\n", globalVar);return 0;
}// 建议:如果globalVar仅被main函数使用,应定义为静态
// static int globalVar = 10;

8. 必需。静态存储类说明符应在所有具有内部链接的对象和函数的声明中使用

#include <stdio.h>int func(); // 错误:函数声明未使用静态存储类int main() {printf("%d\n", func());return 0;
}int func() {return 10;
}

9. 建议。如果一个对象的标识符仅在一个函数内出现,该对象应被定义在块范围内

#include <stdio.h>int globalVar = 10; // 全局变量int main() {printf("%d\n", globalVar);return 0;
}// 建议:如果globalVar仅被main函数使用,应定义为局部变量
// int main() {
//     int localVar = 10;
//     printf("%d\n", localVar);
//     return 0;
// }

10. 必需。内联函数定义时应用静态存储类声明

#include <stdio.h>inline int add(int a, int b) { // 错误:内联函数未使用静态存储类return a + b;
}int main() {printf("%d\n", add(5, 3));return 0;
}

11. 建议。当有外部链接的数组被定义,应显式指定其大小

#include <stdio.h>int globalArray[] = {1, 2, 3}; // 错误:外部链接数组未显式指定大小int main() {printf("%d\n", globalArray[0]);return 0;
}

12. 必需。枚举列表内的枚举值应独一无二

#include <stdio.h>enum Colors {RED,GREEN,BLUE,RED // 错误:枚举值RED重复
};int main() {return 0;
}

13. 建议。指针最好指向一个const类型的变量

#include <stdio.h>int main() {int a = 10;int *ptr = &a; // 错误:指针未指向const类型变量printf("%d\n", *ptr);return 0;
}

14. 必需。不得使用restrict限定词

#include <stdio.h>void func(int * restrict a, int * restrict b) { // 错误:使用了restrict限定词*a = 10;*b = 20;
}int main() {int x, y;func(&x, &y);printf("%d %d\n", x, y);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/bicheng/89459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【blender】使用Vscode进行blender调试

配置vscodeblender 直接使用blender中的text editor没有代码补全&#xff0c;终端输出通常和blender不在同一个页面&#xff0c;只适合非常简单的代码测试。使用Vscode能有效提高blender调试的效率&#xff0c;具体方式见&#xff1a;VSCode 开发 Blender脚本工具配置。 调试…

Au速成班-乐理知识补充+网页下载音乐

音质分类 通过查看音频频谱&#xff0c;128Kbps、192Kbps、320Kbps、无损&#xff08;Lossless HD&#xff09;CD音质&#xff08;频率都在20kHz以上&#xff09;。 各家平台对无损的定义不一样&#xff0c;em各有说法吧。 无损的含义是&#xff1a;无损失的声音格式。只要能…

JAVA中的Collection集合及ArrayList,LinkedLIst,HashSet,TreeSet和其它实现类的常用方法

文章目录前言一、Collection 接口常用方法1.boolean add(E e)2.boolean remove(Object o)3.boolean contains(Object o)4.boolean isEmpty()5.int size()6.void clear()7.Object[] toArray()8.boolean containsAll(Collection<?> c)9.boolean addAll(Collection<? e…

有n棍棍子,棍子i的长度为ai,想要从中选出3根棍子组成周长尽可能长的三角形。请输出最大的周长,若无法组成三角形则输出0。

题目描述&#xff1a; 有n棍棍子&#xff0c;棍子i的长度为ai&#xff0c;想要从中选出3根棍子组成周长尽可能长的三角形。请输出最大的周长&#xff0c;若无法组成三角形则输出0。 算法为O(nlogn) 初始理解题目 首先&#xff0c;我们需要清楚地理解题目要求&#xff1a; 输入…

【Echarts】 电影票房汇总实时数据横向柱状图比图

效果图code <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>圆角柱状图</title><script src"https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js"></script> </head> <…

【深度学习基础】PyTorch中model.eval()与with torch.no_grad()以及detach的区别与联系?

目录1. 核心功能对比2. 使用场景对比3. 区别与联系4. 典型代码示例(1) 模型评估阶段(2) GAN 训练中的判别器更新(3) 提取中间特征5. 关键区别总结6. 常见问题与解决方案(1) 问题&#xff1a;推理阶段显存爆掉(2) 问题&#xff1a;Dropout/BatchNorm 行为异常(3) 问题&#xff1…

博客摘录「 华为云平台-FusionSphere OpenStack 8.2.1 系统加固」2025年7月15日

编号 加固项 "风险 等级" 加固原理/Rationale 审计方法/Audit 期望结果/Expect Results 加固方法/Remediation 1 OpenSSH加固配置 1.1 OpenSSH加固配置 1.1.1 SSH使用的版本 H "Op…

永磁同步电机MTPA与MTPV曲线具体仿真实现

永磁同步电机MTPA与MTPV曲线具体仿真实现 近期做了一些标定试验&#xff0c;实际电机参数并不是确定的&#xff0c;而是变化的&#xff0c;因此很难通过解析的方法算出MTPA的对应点&#xff0c;以及在弱磁区如何过度到MTPV。这个在实际情况下都是一点点标出来的&#xff0c;我这…

Adobe Acrobat 插件功能、应用与开发

什么是 Acrobat 插件&#xff1f; Adobe Acrobat 插件是一种能够扩展 Adobe Acrobat 阅读器/查看器功能的软件组件。Acrobat 是用于查看、创建和编辑 PDF 文档的流行程序&#xff0c;而插件可以为其添加新功能&#xff0c;例如&#xff1a; #mermaid-svg-iqdM1wLkFQhd3ilQ {fon…

Redis学习系列之——高并发应用的缓存问题(二)

一、布隆过滤器布隆过滤器由一个 BitMap 和若干 Hash 函数组成&#xff0c;可以用来快速判断一个值是否存在后端存储中。它是解决 Redis 缓存穿透问题的一个不错的解决方案。工作原理步骤1&#xff1a;当 key-value 键值对存储到 Redis 后&#xff0c;向布隆过滤器添加 key步骤…

Expression 类的静态方法

public static MethodCallExpression Call(Type type, // 包含目标方法的类型string methodName, // 方法名称Type[]? typeArguments, // 泛型方法的类型参数&#xff08;非泛型方法为 null&#xff09;params Expression[]? arguments // 方…

[Nagios Core] 事件调度 | 检查执行 | 插件与进程

第五章&#xff1a;事件调度 欢迎回到Nagios Core&#xff01; 在上一章第四章&#xff1a;配置加载中&#xff0c;我们了解了Nagios如何读取配置文件以知晓需要监控的对象&#xff0c;比如我们的朋友"Web Server 1"。此时Nagios内存中已构建完整的基础设施拓扑图。…

Web3 常用前端库介绍

一、Web3 前端开发&#xff1a;连接用户与区块链的桥梁 随着 Web3 生态的蓬勃发展&#xff0c;前端开发从传统的页面渲染进化为区块链交互的核心枢纽。Web3 前端库作为连接用户与区块链的桥梁&#xff0c;承担着钱包集成、合约交互、数据可视化等关键功能。本文将系统解析主流 …

cnpm命令报internal/modules/cjs/loader.js:797 throw err; ^ Error: Cannot find

在运行一个项目的时候&#xff0c;需要升级电脑各组件的版本&#xff0c;结果导致cnpm命令无法正常使用&#xff0c;cnpm任何命令都会报如下这个错&#xff1a;找了半天&#xff0c;发现是由于cnpm与npm的版本不一致导致的&#xff0c;所以需要卸载并重新安装cnpm&#xff0c;重…

15、鸿蒙Harmony Next开发:创建自定义组件

目录 自定义组件的基本用法 自定义组件的基本结构 struct Component freezeWhenInactive build()函数 Entry EntryOptions Reusable 成员函数/变量 自定义组件的参数规定 build()函数 自定义组件生命周期 自定义组件的创建和渲染流程 自定义组件重新渲染 自定义…

深入理解Map.Entry.comparingByValue()和Map.Entry.comparingByKey()

文章目录深入理解Map.Entry.comparingByValue()和Map.Entry.comparingByKey()1. 方法定义comparingByKey()comparingByValue()2. 基本用法2.1 使用comparingByKey()2.2 使用comparingByValue()3. 方法重载版本comparingByKey(Comparator)comparingByValue(Comparator)4. 高级用…

Mac下载mysql

安装 brew list --versions | grep mysql查看已安装的mysql版本brew search mysql查看支持的mysql版本brew info mysql查看mysql版本信息brew install mysql进行安装/opt/homebrew/opt/mysql/bin/mysqld --initialize-insecure --user$(whoami) --basedir$(brew --prefix mysql…

PageHelper使用说明文档

文章目录一、简介二、集成步骤三、使用方法四、注意事项五、高级用法一、简介 PageHelper 是一个开源的 MyBatis 分页插件&#xff0c;它可以帮助我们在使用 MyBatis 进行数据库操作时方便地实现分页功能。通过简单的配置和少量的代码修改&#xff0c;就可以在查询数据时实现分…

grpo nl2sql qwen3 模型强化学习训练有效果的成立条件有哪些

在使用GRPO&#xff08;强化学习算法&#xff09;对Qwen3模型在NL2SQL&#xff08;自然语言到SQL转换&#xff09;任务上进行强化学习&#xff08;RL&#xff09;训练时&#xff0c;其效果成立的核心条件可归纳为以下几个关键维度&#xff0c;这些条件相互关联&#xff0c;共同…

面向向量检索的教育QA建模:九段日本文化研究所日本语学院的Prompt策略分析(6 / 500)

面向向量检索的教育QA建模&#xff1a;九段日本文化研究所日本语学院的Prompt策略分析&#xff08;6 / 500&#xff09; 系列说明 500 所日本语言学校结构化建模实战&#xff0c;第 6 篇。每篇拆解 1 所学校在 Prompt-QA 系统中的建模策略&#xff0c;分享工程经验&#xff0c;…