ArcticCore重构-VALIDATE_%
Posted 技术之一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArcticCore重构-VALIDATE_%相关的知识,希望对你有一定的参考价值。
基于arc-stable-9c57d86f66be
基本问题
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,0,_api,_err); return __VA_ARGS__; } #define VALIDATE_NO_RV(_exp,_api,_err ) if( !(_exp) ) { (void)Det_ReportError(CAN_MODULE_ID,0,_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,0,_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,0,_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, 0, _api, _err) #define VALIDATE_RV(_exp, _api, _err, _rv) \ __VALIDATE_RV(_exp, __THIS_MODULE_ID, 0, _api, _err, _rv) #define VALIDATE_NO_RV(_exp, _api, _err) \ __VALIDATE_NO_RV(_exp, __THIS_MODULE_ID, 0, _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_%的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode_98]Validate Binary Search Tree