ArcticCore重构-VALIDATE_%
基于官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5
基本问题
Arctic Core中使用了VALIDATE, VALIDATE_RV, VALIDATE_NO_RV等一系列宏简化参数判断。
#if ( CAN_DEV_ERROR_DETECT == STD_ON )
#define VALIDATE(_exp,_api,_err, ... ) \
if( !(_exp) ) { \
(void)Det_ReportError(CAN_MODULE_ID,,_api,_err); \
return __VA_ARGS__;\
} #define VALIDATE_NO_RV(_exp,_api,_err ) \
if( !(_exp) ) { \
(void)Det_ReportError(CAN_MODULE_ID,,_api,_err); \
return; \
} #define DET_REPORTERROR(_x,_y,_z,_q) (void)Det_ReportError(_x, _y, _z, _q)
#else
#define VALIDATE(_exp,_api,_err, ... )
#define VALIDATE_NO_RV(_exp,_api,_err )
#define DET_REPORTERROR(_x,_y,_z,_q)
#endif
方法是在每一个使用到这些宏的文件中都重新定义一遍。理由比较直接,因为每个模块是否打开这些宏,都有各自的开关。
简化的方法也很直接:重复的定义,提取到头文件(validate.h)中即可。
问题在于如何处理:
- 每个模块的开关宏;
- 每个模块不同的MODULE_ID;
因此,不能直接include该头文件就结束。
头文件的定义也依赖于这两个因素。
- 头文件中使用的开关宏取决于每个模块的开关宏;
- 头文件中使用的MODULE_ID取决于每个模块的MODULE_ID;
即:
#ifdef __THIS_MODULE_ENABLE_VALIDATE
#include <Det.h> #ifndef __THIS_MODULE_ID
#error "__THIS_MODULE_ID should be defined."
#endif #define VALIDATE(_exp, _api, _err) \
if( !(_exp) ) { \
(void)Det_ReportError(__THIS_MODULE_ID,,_api,_err); \
return __VA_ARGS__;\
} #define VALIDATE_RV(_exp, _api, _err, _rv) \
if( !(_exp) ) { \
Det_ReportError(__THIS_MODULE_ID, _instance, _api, _err); \
return _rv; \
} #define VALIDATE_NO_RV(_exp, _api, _err) \
if( !(_exp) ) { \
(void)Det_ReportError(__THIS_MODULE_ID,,_api,_err); \
return; \
} #define DET_REPORTERROR(_module, _instance, _api, _err) \
Det_ReportError(_module,_instance,_api,_err) #else #define VALIDATE(_exp, _api, _err)
#define VALIDATE_RV(_exp, _api, _err, _rv)
#define VALIDATE_NO_RV(_exp, _api, _err)
#define DET_REPORTERROR(_module, _instance, _api, _err) #endif
而使用的地方替换如下:
#if ( CAN_DEV_ERROR_DETECT == STD_ON )
#define __THIS_MODULE_ENABLE_VALIDATE 1
#define __THIS_MODULE_ID MODULE_ID_CAN
#endif
#include <validate.h>
如此每次需要使用VALIDATE_%类宏时,只需要提供所需的编译时信息即可。
提高复用,简洁明了。
更进一步
考虑到某些模块中报错是传递的不是本模块的MODULE_ID,有可能出现某次传递其他非本模块MODULE_ID的情况。为了提高灵活性,可以考虑提供外部传入全部参数的API。如下:
#ifndef __THIS_MODULE_ID
#error "__THIS_MODULE_ID should be defined."
#endif #define __VALIDATE(_exp, _module, _instance, _api, _err) \
if( !(_exp) ) { \
Det_ReportError(_module, _instance, _api, _err); \
} #define __VALIDATE_RV(_exp, _module, _instance, _api, _err, _rv) \
if( !(_exp) ) { \
Det_ReportError(_module, _instance, _api, _err); \
return _rv; \
} #define __VALIDATE_NO_RV(_exp, _module, _instance, _api, _err) \
if( !(_exp) ) { \
Det_ReportError(_module, _instance, _api, _err); \
return; \
} #define VALIDATE(_exp, _api, _err) \
__VALIDATE(_exp, __THIS_MODULE_ID, , _api, _err) #define VALIDATE_RV(_exp, _api, _err, _rv) \
__VALIDATE_RV(_exp, __THIS_MODULE_ID, , _api, _err, _rv) #define VALIDATE_NO_RV(_exp, _api, _err) \
__VALIDATE_NO_RV(_exp, __THIS_MODULE_ID, , _api, _err) #define DET_REPORTERROR(_module, _instance, _api, _err) \
Det_ReportError(_module,_instance,_api,_err) #else #define __VALIDATE(_exp, _module, _instance, _api, _err)
#define __VALIDATE_RV(_exp, _module, _instance, _api, _err, _rv)
#define __VALIDATE_NO_RV(_exp, _module, _instance, _api, _err)
#define VALIDATE(_exp, _api, _err)
#define VALIDATE_RV(_exp, _api, _err, _rv)
#define VALIDATE_NO_RV(_exp, _api, _err)
#define DET_REPORTERROR(_module, _instance, _api, _err)
#endif
如有需要,可以使用__VALIDATE_%类宏。
ArcticCore重构-VALIDATE_%的更多相关文章
- ArcticCore重构-问题列表1
基于官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5 基本问题 Arctic Core中的代码组织有很多有待改进的地方,这里先提出几点: 1. 头文件引用混乱,所有头文 ...
- AUTOSAR ArcticCore重构 - for_each_HOH
Arctic Core是AUTOSAR的实现,早期版本是开源的. 基本问题 在ARM架构下对CAN driver的实现(arch/arm/arm_cm3/drivers/Can.c)中,有这样一段代码 ...
- 记一次.NET代码重构
好久没写代码了,终于好不容易接到了开发任务,一看时间还挺充足的,我就慢慢整吧,若是遇上赶进度,基本上直接是功能优先,完全不考虑设计.你可以认为我完全没有追求,当身后有鞭子使劲赶的时候,神马设计都是浮云 ...
- CSharpGL(17)重构CSharpGL
CSharpGL(17)重构CSharpGL CSharpGL用起来我自己都觉得繁琐了,这是到了重构的时候. 下载 CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入(https ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构
系列目录 前言:这是对本文系统一次重要的革新,很久就想要重构数据访问层了,数据访问层重复代码太多.主要集中增删该查每个模块都有,所以本次是为封装相同接口方法 如果你想了解怎么重构普通的接口DAL层请查 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(59)-BLL层重构
系列目录 前言: 这应该是本系统最后一次重构,将重构BLL层和Model层.来完全取代代码生成器生成的BLL层和DAL层.完全废掉了代码生成器的DAL,BLL,MODEL层. 全自动生成增,删,改 ...
- 原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前
思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...
- Android重构与设计之路,从整理提示弹窗(SmartAlertPop)开始
封装一个独立弹窗Module,这里的弹窗包括普通的Dialog方式弹框和WindowManager方式弹窗.提供一种管理项目里面弹窗的方案,便于后期修改和维护. 首先描述一个在大项目中普遍存在的一个现 ...
- 产品前端重构(TypeScript、MVC框架设计)
最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容. 公司期望把某一管理类信息系统从项目代码中抽取.重构为一个可复用的产品.该系统的前端是基于 ExtJs 5 进行构造的, ...
随机推荐
- 海量数据挖掘MMDS week3:社交网络之社区检测:高级技巧
http://blog.csdn.net/pipisorry/article/details/49052255 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- 自建log4cxx.sln
log4cxx的下载包是0.10版本的,代码较旧,有些错误,应该从主干下载最新的代码. 0.10的下载包中有projects目录,内有VC6的工程文件; 还有site目录,内有vc构建的帮助文档vst ...
- JQuery实战总结二 横向纵向菜单下拉效果图
记得以前在浏览了大多数网站的上面发现很多下拉的导航栏,觉得特别好玩,毕竟咱们是学习编程的嘛,对这下拉的效果还是挺感兴趣的,这种淡入淡出,随着鼠标移动的位置不同.有无等而出现不同的效果,给用户以神美感. ...
- Gradient Descent 梯度下降法-R实现
梯度下降法: [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt 作为一个初学者,水平有限,欢迎交流指正. 应用:求线性回归方程的系数 目标:最小化损失 ...
- window环境下搭建react native及相关插件
可以先浏览一下中文翻译的开发文档具体了解一下关于React Native,想要查看官方文档可以点http://facebook.github.io/react-native/docs/getting- ...
- React Native ios开发第一课
前言 本篇文章的作用在于帮助你快速上手使用React Native编写iOS应用.如果你现在还不太了解React Native是什么以及Facebook为什么要创建React Native,你可以先看 ...
- 嵌入式C语言查表法的项目应用
嵌入式C实战项目开发技巧:如果对一个有规律的数组表进行位移操作 就像下面的这个表 之前写过上面这个标题的一篇文章,讲的是以位移的方式去遍历表中的数据,效率非常高,但是,如果要实现一个乱序的流水灯或者跑 ...
- libRTMP使用说明
名称 librtmp − RTMPDump Real-Time Messaging Protocol API 库 RTMPDump RTMP(librtmp, -lrtmp) 简介 #include& ...
- Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper
RecyclerView这个被誉为ListView和GirdView的替代品,它的用法在之前的一篇博文中就已经讲过了,今天我们就来实现RecyclerView的侧滑删除和长按拖拽功能,实现这两个功能我 ...
- Leetcode_198_House Robber
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/47680663 You are a professional ...