技术标签: MisraC
嵌入式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 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
二、asm
ASM是C++中的一个关键字,用于在C++源码中内嵌汇编语言。ASM能写在任何C++合法语句中,目前asm还不是C的标准关键字,C11标准未加入正文,仅在Annex J中标记为“公共扩展
ed2k下载 在下载ed2k资源的时候,浏览器一般不能直接下载,这个时候该怎么办呢?方法一:下载迅雷,直接安装方法二:使用在线工具,将链接转化为别的形式https://tool.lu/urlconvert/ 方法三:百度网盘离线下载然后就可以通过一...
#!/usr/bin/python是用来说明脚本语言是python的是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。# -*- coding: utf-8 -*-是用来指定文件编码为utf-8的详情可以参考:PEP 0263 — Defining Python Source Code Encoding...
创建struts1.2 + Hibernate3.0 Web工程(一)1. 环境说明 安装Eclipse和安装MyEclipse组件的过程在这里不进行介绍。可以参考其它资料完成Eclipse环境的安装与资源的配置。 接下来的...
PWN的学习写在前面的话0x01 Hello,PWN!0x02写在前面的话如题,胖手的回归我愿称之为重操旧业。pwn的学习难度比较大,牵涉范围又广,我也不知道为啥选了这个方向????。前两天写个最简单的溢出没写出来,想想趁这个寒假重新学起,笔记po这里日常更新????仅供参考,不是系统学习,以打比赛为目的,途径主要是到处找的小视频、大佬们的博客和题目。希望看到的铁汁们不吝赐教!0x01 Hello,PWN!"Pwn"是一个黑客语法的俚语词,是指攻破设备或者系统 。CTF中的pwn是指通过程序本身
A.Hands贪心B.log贪心换最小C.Large RPS Tournament倍增DPD.L可以在小范围内BFS然后再将终点映射到这个范围内,但是很麻烦。将题意转化为三角形重心的移动,每一次可以向除了对角以外的七个方向移动,因此只需要在max(∣x∣,∣y∣)max(|x|,|y|)max(∣x∣,∣y∣)的基础上加上需要按照对角线调整的+1贡献即可(还要判掉同一个格子内的情况)E.1D Reversi Builder发现性质,1…1,11…1000…0,以及111
项目从SVN检出到工作空间后报了很多错误,其中很明显就是一些jar的问题,没有相关的jar或版本问题,看到最后的错误Unbound classpath container: 'JRE System Library [JavaSE-1.7]' in project 'idweb',就很明白了,JRE问题了,解决办法如下:项目右键属性--->Java Build Path--->Libraries
有点那个了…………本来呢保存两行容易写很多,钻牛尖了,不过其实写完之后觉得都很简单,也就这样罢了就是记录下每一次比较有可能被覆盖的两个点[i-1][j-1] 与 [i-1][j]就可以了由递推式: dp[i][j] = dp[i-1
3.编写后序遍历二叉树非递归算法后序非递归遍历二叉树的顺序是先访问左子树,再访问右子树,最后访问根节点,当用堆栈来存储节点时必须分清返回根节点时是从左子树返回的还是从右子树返回的。所以使用辅助指针r,其指向最近访问过的结点。也可在节点中增加一个标志域,记录是否已经被访问过。void PostOrder(BiTree T){ InitStack(S); Bnode *p=T,*r=NULL; while(p||!IsEmpty){ if(p){ push(S,p); p=p
环境:Ubuntu 12.04.2 LTS编译:ICS./mk-ics.sh 4make hisdk#########################make: *** [out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/noproguard.classes-with-local.dex]
http://www.ibm.com/developerworks/cn/webservices/ws-soi1/http://www.ibm.com/developerworks/cn/webservices/ws-soi2/ 以服务为中心的企业整合-案例分析 ...
Django 是由 Python 编写的一个开源 Web 应用框架,Python + Django 是快速开发、设计、部署网站的最佳组合!
Python Web 框架 Django一、特点 1、快速开发(用python开发、用数据库ORM系统) 2、大量内置应用(后台管理系统admin、用户认证系统auth、回话系统sessions) 3、安全性高(表单验证、SQL注入、跨站点攻击) 4、易扩展(需求变更,增加应用即可)...