1 什么是编译器?
不同的编译器,有不同的审查规范,也就间接导致了我们编译代码过程与结果的差异。同一行代码,在审查不严格的编译器,不会报错;在审查严格的编译器,则会报错。
常用的C语言编译器有GCC(G++)、TCC、Clang、VC++2010等。
取决于编译器的行为有很多,例如:浮点类型的舍入关系等。
编译器本质上就是把不同的.c/.cpp文件根据.h中的符号表汇总成一个可执行文件,源码有多大最终的可执行文件就有多大,但是可以通过dlopen形式调用动态链接库,这样的优点有:
在代码处使用函数标识符形式替代函数体,可缩小可执行文件的体积。
在中间件代码中,中间件涉及多平台共用场景,若某平台未添加某函数的实现,则不会导致编译问题,此条最重要。
2 软件为什么需要分层结构?
之前在做嵌入式裸机开发时,一直不理解如何分层设计,是直接调用方案商/原厂提供的库还是中间封装一层再给逻辑层使用?到底OSI七层模型为什么要搞个七层而不是直接就一层给工程师开发?如今在接触更复杂的软件系统后,逐渐明白,当某模块可独立且需要有大量独立逻辑时,才有必要针对此模块单独分层设计。只有这样,针对复杂的软件系统,可以分层给不同的开发人员做维护,各层之间再通过其他API进行传递。分层后,由于所有代码不是在一坨上,模块化设计可使代码更易于维护。
中间件层:在汽车、手机、电视中普遍存在的一个层级是中间件层,这层对上对接UI,对下对接方案商,普遍使用c/c++进行编码开发,中间件特别需要重视的点是不要挂(接口定义不存在、踩内存等)。
这层开发过程中谨防对下调用接口不存在的情况,故需使用dlopen的形式打开。
谨防对下接口对不齐导致的挂掉,因此最好使用key-value的形式,而非结构体入参形式。
减少指针的使用,增加C++ 中引用的使用。
减少私有typedef定义的情况,使用标准的关键字int32_t等。
3 程序调试时最难调试的Bug?
程序调试时最大的Bug是Core dump,Core dump发生时无既定Log打印,无法排查具体位置,一般当调用接口的实现不存在时或者出现踩内存的情况时会出现Core dump。
Core dump出现的解法:
Android中可以查看bugreport文件,此文件中包含程序出问题的代码段信息。