ArcCore重构-头文件引用问题的初步解决

基于官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5
 
基本问题
1. 头文件引用混乱,所有头文件通过从搜索路径(-I)中引用,存在名称污染问题,需加入路径信息;
 
ArcCore代码的编译系统中,定义了大量的inc-y路径,最后使用-I参数将这些路径加入到编译器的命令行参数中。而代码文件中,引用头文件时都是直接使用 #include "xxx.h" 的形式。
 
这样有几个问题:
1. 编译系统负担过重,需要加入大量的头文件搜索路径;
2. 导致头文件名称污染问题,设想如果存在两个相同名称的头文件,则会出现引用混乱,先找到哪个算哪个?
3. 导致代码结构不清,不清楚所引用的头文件的存放位置。不易阅读代码,不易掌握代码结构;
 
重构的目标为:
1. 头文件引用,基于一个相对路径,使用尖括号引用,如: #include <xxx.h> 
2. 大量缩减inc-y的量,只需要少量的几个,如TOPDIR/include, ARCHDIR/include等;
 
反过来看,名称污染问题的可能性是存在的,而当前的代码没有出现问题,在于没有出现同名的头文件。所以有一个简单的解决办法,就是统一基于TOPDIR/include路径,将所有代码文件中的头文件引用进行替换。
 
可以使用脚本来完成这一动作,如下:
#!/bin/bash
# $1: TOPDIR if specified

CURDIR=$(pwd)
TOPDIR=$CURDIR
TMPHDR=/tmp/.tmp.headers
[ -n "$1" ] && TOPDIR=$1

header_files=$(find ${TOPDIR} -name "*.h")
echo -n > $TMPHDR
for h in $header_files
do
    echo ${h#${TOPDIR}/} >> $TMPHDR
done

unhandled_headers=
target_files=$(find ${CURDIR} -name "*.c" -o -name "*.h")
for t in $target_files
do
    echo "Handling ${t#${CURDIR}/}..."
    _headers=$(grep "#include" $t | awk '{print $2}')
    for h in ${_headers}
    do
        echo -n "  $h"
        [ "${h:0:1}" == "<" ] && echo && continue

        # 1 for the double-quote
        nh=$(grep -w ${h:1:0-1} $TMPHDR 2>/dev/null)
        if [ -z "$nh" ]; then
            unhandled_headers="$unhandled_headers $h"
            echo
            continue
        fi
        [ "${nh:0:8}" == "include/" ] && nh=${nh#"include/"}
        echo " ---> <$nh>"
        sed -i "s@$h@<$nh>@g" $t
    done
done

echo "Header files not handled: $unhandled_headers"

#rm -f $TMPHDR

 

posted @ 2018-05-06 16:20  wjcdx  阅读(479)  评论(0编辑  收藏  举报