基於官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5api
Arctic Core中使用了VALIDATE, VALIDATE_RV, VALIDATE_NO_RV等一系列宏簡化參數判斷。spa
#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
方法是在每個使用到這些宏的文件中都從新定義一遍。理由比較直接,由於每一個模塊是否打開這些宏,都有各自的開關。code
簡化的方法也很直接:重複的定義,提取到頭文件(validate.h)中便可。blog
問題在於如何處理:編譯
所以,不能直接include該頭文件就結束。table
頭文件的定義也依賴於這兩個因素。class
即:module
#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
而使用的地方替換以下:date
#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_%類宏。