• 如何让 Source Insight 识别 AUTOSAR 宏定义 FUNC


    有很多从事汽车电子行业的软件工程师在使用Source Insight阅览Classic AUTOSAR协议栈源码的时候,

    发现函数名无法解析,基本上都变成了FUNC。

    • 先说原因:

    AUTOSAR的协议栈为了实现多平台和编译器兼容,大量使用宏定义来代替关键字。

    函数,指针,返回值,等等。这样可以实现代码对编译器的解耦和复用。

    这种标准或者平台化设计的代码,真的和目标就是一亩三分地开发的模式不一样。为了可扩展和复用解耦,增加了很多设计。

    • 解决方法:

    Source Insight在 C:\Users\你的用户名\Documents\Source Insight 4.0下面有一个C.tom。在里面可以自定义一些宏展开,

    让Source Insight解析,在分析符号的时候进行替换。

    注意:目前发现好像不支持宏的嵌套使用,也就是说不可避免的,有一些嵌套使用的宏定义会解析错误。常见于指针的使用解析。

    比如FUNC里传入参数是个用宏描述的常量指针,就会被误识别。

    宏定义的来源一般放在各种文件名带"compiler"的头文件下,搜索“#define FUNC”这样的字符串差不多就可以搜索到。

    例如:

    1. #define FUNC(rettype, memclass) rettype
    2. #define FUNC_P2CONST(rettype, ptrclass, memclass) const rettype *
    3. #define FUNC_P2VAR(rettype, ptrclass, memclass) rettype *
    4. #define P2VAR(ptrtype, memclass, ptrclass)     ptrtype *
    5. #define P2CONST(ptrtype, memclass, ptrclass)  const ptrtype *
    6. #define CONSTP2VAR(ptrtype, memclass, ptrclass) ptrtype * const
    7. #define CONSTP2CONST(ptrtype, memclass, ptrclass) const ptrtype * const
    8. #define P2FUNC(rettype, ptrclass, fctname) rettype (* fctname)
    9. #define CONSTP2FUNC(rettype, ptrclass, fctname) rettype (* const fctname)
    10. #define CONST(consttype, memclass) const consttype
    11. #define VAR(vartype, memclass) vartype
    12. #define P2P2VAR(ptrtype, memclass, ptrclass) ptrtype **

    这样只需要在C.tom末尾添加上述内容,去掉前面的#define就可以了

    例如:

    1. FUNC(rettype, memclass) rettype
    2. FUNC_P2CONST(rettype, ptrclass, memclass) const rettype *
    3. FUNC_P2VAR(rettype, ptrclass, memclass) rettype *
    4. P2VAR(ptrtype, memclass, ptrclass) ptrtype *
    5. P2CONST(ptrtype, memclass, ptrclass) const ptrtype *
    6. CONSTP2VAR(ptrtype, memclass, ptrclass) ptrtype * const
    7. CONSTP2CONST(ptrtype, memclass, ptrclass) const ptrtype * const
    8. P2FUNC(rettype, ptrclass, fctname) rettype (* fctname)
    9. CONSTP2FUNC(rettype, ptrclass, fctname) rettype (* const fctname)
    10. CONST(consttype, memclass) const consttype
    11. VAR(vartype, memclass) vartype
    12. P2P2VAR(ptrtype, memclass, ptrclass) ptrtype **
    • 还有别的宏?

    上述的内容比较常用,下面讲讲个性化的。

    可能还会遇到各种各样奇奇怪怪的用法,甚至还有些函数在代码里都搜索不到,实际上都可能是宏甚至是字符串拼接宏。

    例如常见的:

    1. TASK(your_task_name)
    2. {
    3. ...
    4. }

    实际上这是一个定义在OS User Interface系列头文件中的宏,

    #define Task(TaskName) void Os_Task_##TaskName(void)

    在C.tom中,就可以直接写上:

    Task(TaskName) void Os_Task_##TaskName(void)

    修改完之后,重启source insight或者rebuild工程,可以让修改生效!

  • 相关阅读:
    如何通过puppetter实现PDF聚合阅读器初始模型以及产品思维构想
    Springcloud----sleuth+zipkin链路追踪
    1.3.20 交换机端口安全
    web前端期末大作业实例 (1500套) 集合
    100道基于Android毕业设计的选题题目,持续更新
    机器视觉工程师为什么要反复调试?
    Elastic Stack 8.10:更简单的跨集群搜索和身份验证等等
    docker 容器数据在盘与盘之间迁移
    关于#搜索引擎#的问题:是否可以在输入框中Tab键切换搜索引擎
    Vue中methods实现原理
  • 原文地址:https://blog.csdn.net/kuno_y/article/details/133804017