zoukankan      html  css  js  c++  java
  • 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,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)中即可。

    问题在于如何处理:

    1. 每个模块的开关宏;
    2. 每个模块不同的MODULE_ID

    因此,不能直接include该头文件就结束。

    头文件的定义也依赖于这两个因素。

    1. 头文件中使用的开关宏取决于每个模块的开关宏;
    2. 头文件中使用的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_%类宏。

  • 相关阅读:
    自己常用网站记录
    css弹性布局指定显示行数多余文字去掉用省略号代替以及弹性布局中css 卡片阴影效果
    微信小程序页面传参被截取问题
    阴影效果 css3 为什么要加 -moz-box-shadow -webkit-box-shadow -o-box-shadow,直接用box-shadow不是都能识别吗?
    css常用清除浮动方式
    什么是微信小程序云开发 它的作用是什么
    JMeter压测“java.net.SocketException: Socket closed”解决方法
    Jmeter压力测试工具安装及使用教程
    OnActionExecuting和OnActionExecuted执行顺序
    C#循环下载多个文件(把多个文件压缩成一个文件可以一次性下载)
  • 原文地址:https://www.cnblogs.com/wjcdx/p/8996733.html
Copyright © 2011-2022 走看看