嵌入式C语言中,Misra C2012规定的可以使用的关键字

一、__inlie

inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义

表达式形式的宏定义一例:

#define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))

取代这种形式的原因如下:

1. C中使用define这种形式宏定义的原因是因为,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作,因此,效率很高,这是它在C中被使用的一个主要原因。

2. 这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。

3. 在C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。

4. inline 推出的目的,也正是为了取代这种表达式形式的宏定义,它消除了宏定义的缺点,同时又很好地继承了宏定义的优点。

具体分析

1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。

2. 很明显,类的内联函数也是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。

3. inline 可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。

此外还有一些规则需注意:

1、inline说明对编译器来说只是一种建议,编译器可以选择忽略这个建议。比如,你将一个长达1000多行的函数指定为inline,编译器就会忽略这个inline,将这个函数还原成普通函数。

2、在调用内联函数时,要保证内联函数的定义让编译器"看"到,也就是说内联函数的定义要在头文件中,这与通常的函数定义不一样。但如果你习惯将函数定义放在CPP文件中,或者想让头文件更简洁一点,可这样做:

1

//SomeInline.h中

1

2

3

4

5

6

7

8

9

10

11

12

13

#ifndef SOMEINLINE_H

#define SOMEINLINE_H

Type Example(void);

//........其他函数的声明

#include"SomeInlie.cpp" //源文件后缀名随编译器而定

#endif

//SomeInline.cpp中

#include"SomeInline.h"

inline Type Example(void)

{

//..........

}

//...............其他函数的定义

二、asm

ASM是C++中的一个关键字,用于在C++源码中内嵌汇编语言。ASM能写在任何C++合法语句中,目前asm还不是C的标准关键字,C11标准未加入正文,仅在Annex J中标记为“公共扩展

MISRAC系列之 Rule 1.1-1.3 C语言环境相关推荐

  1. python是一种蟒蛇使用的语言_python树莓派系列教程一:初识大蟒蛇 python(python语言环境搭建篇)...

    作者:剑若游龙微信公众号<科学是什么东东>,欢迎关注 作者微信号,欢迎与我交流 网络爬虫,人工智能,机器学习,如何让计算机理解能力更强,如 何让你手中的机器人更人性化,更聪明? 不管是大人 ...

  2. Oracle APEX 系列文章15:无人值守一键安装Oracle APEX环境

    本文是钢哥的 Oracle APEX 系列文章的第15篇,完整文章目录如下: Oracle APEX 系列文章01:Oracle APEX, 让你秒变全栈开发的黑科技 Oracle APEX 系列文章 ...

  3. 【Python3.6+Django2.0+Xadmin2.0系列教程之一(入门篇-上)】环境搭建及项目创建

    由于工作需要,接触了大半年时间的Django+xadmin框架,一直没空对这块对进行相关的梳理.最近在同事的怂恿下,就在这分享下笔者的学习及工作经验吧. 好了,话不多说,下面开始进入正题: 转载请注明 ...

  4. IT职场人生系列之二十一:如何学习新语言(一)

    这是IT职场人生系列的第二十一篇.(序言,专栏目录) 最近<火星人敏捷开发管理工具>接近发版了,回忆起一年半以前刚利用业余时间开工的时候,编程已经中断了7年(03年最后一次用VC++6.0 ...

  5. 【年终总结系列 2021】不变的心态应对变化的环境

    残阳,冷雪,鸦声阵阵,将这肃杀的氛围烘托到极致,周围的兄弟一个个不是倒下就是身负重伤,江湖的悲观传闻愈来愈盛,耳听皆为哀鸣,目及无不饿殍,周遭的一切传递了一个危险的讯号:寒冬已至! 2022年元旦钟声 ...

  6. 基于c语言c8051f系列微控制器原理与应用,基于C语言C8051F系列微控制器原理与应用...

    第1章 微控制器的原理 1.1 微控制器与计算机的关系 1.2 微控制器系统简介 1.3 微控制器的发展 1.4 8位机发展的3次技术飞跃 第2章 C8051 F系列单片机结构 2.1 C8051F系 ...

  7. 东信EST-100系列身份证读卡器安卓开发包,Android Studio环境编译

    东信EST-100系列身份证读卡器安卓开发包,以下为源代码 package com.example.sdkdemo;import android.app.Activity; import androi ...

  8. Postman系列(八)-全局变量(Global)、环境变量(Environment)、集合变量(Collection)

    目录 1.变量范围 2.全局变量(Global).环境变量(Environment) a.实例:使用变量配置请求头参数 b.实例:使用环境变量配置域名 3.集合变量 postman支持定义变量,并可以 ...

  9. 寒武纪加速平台(MLU200系列) 摸鱼指南(二)--- 模型移植-环境搭建

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 Ubuntu 18.04 MLU270 加速卡一张 前 ...

  10. 【Lua 教程系列第 2 篇】什么是 Lua 语言?

    这是[Lua 教程系列第 2 篇],如果觉得有用的话,欢迎关注专栏. 一:Lua 语言简介 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而 ...

最新文章

  1. java中this关键词
  2. Delphi 7.0常用函数速查手册
  3. 几种身份的创业者优劣势大比拼
  4. Flask服务部署与简单内网穿透
  5. animate.css官网
  6. android intent 跳转配置,android 再解Intent,通过配置Action和Data跳转
  7. 力扣-150 逆波兰表达式求值
  8. H264--语法及结构--2
  9. 修改Gravatar生成的默认头像
  10. Windows系列服务器上配置JSP运行环境,以及网站上线
  11. GlobalMapper20坐标转换
  12. PC版微信加密图片解密思路与代码实现_Python
  13. 联想台式电脑一键恢复后桌面没有计算机了,联想笔记本一键恢复功能使用教程...
  14. 爬取虎牙TV全站主播信息
  15. 如何从outlook ost恢复数据(ost导入outlook)
  16. 阿里云聆听平台使用有感
  17. 简单测试IP地址连通性
  18. Karaf-cellar 集群配置
  19. 微软的软件测试工程师——《微软的软件测试之道》
  20. 登入验证安全 上(验证码、忘记密码、客户端验证)

热门文章

  1. Oracle的学习视频
  2. 尝试运行项目时出错,无法启动程序 , 由于应用程序配置不正确,未能启动此应用程序。请查看清单文件以查找可能的错误。
  3. 浪曦全部视频【截至4月14日】
  4. 27000系列标准族谱
  5. 软考高项之项目变更管理
  6. Android APK 反编译工具 JADX
  7. matlab线性规划--简单入门
  8. CDISC SDTM CE domain学习笔记
  9. STM32电机TB6612驱动
  10. 平衡小车—TB6612FNG与直流电机控制教程