今天往工程里添加Log.h和Log.cpp这用来打印log的文件时, 编译报错误.
Log.cpp里的一些函数调用func1(), func2(), funcXXX()找不到实现, 可是那些函数明明在公共的接口库xxx.h和xxx.cpp里有声明和实现啊, 函数包含也没有问题.
问题排查 --> xxx.h里的函数声明都是static的, 很奇怪, 经对比, 只是我这个项目里这样, 其它项目里的这个公共接口库xxx.h里的函数声明并非static, 看来是之前维护这套代码的某猿给统一加上的.
--> 可是你作为函数库, 声明为static, 就被限制为了文件内使用, 别人怎么调用啊. 于是把func1()在xxx.h声明中的static去掉, make clean, 再make, 果然该错误解决了.
--> 于是爽快地把文件中所有static全都去掉重新编译. 竟然又报错!!! 一大堆函数重复定义, 去xxx.h里查看, 函数头里也有#ifdef #define #endif这控制头文件重复包含的东西.
--> 仔细查看提示重复定义的函数func3(), 发现它的实现直接写在了xxx.h里(其他大部分函数都比较规范, .h里写声明, cpp文件里写实现. 这个函数是后被加进来的), 而xxx.cpp里原来有它的实现, 被注释掉了. 仔细查看那些错误, 发现这些提示重复定义的, 全都是实现直接写在了.h里.
--> 于是把func3()的定义拿到了cpp里, .h里只是声明. 再编译, 果然编译无错了.
赤裸裸的不遵守良好编程风格的造成的恶果...
该问题是如何产生的? 我猜想是这样的:
--> 某猿向该函数库xxx.h添加新的函数接口func5, 由于不好的编程习惯, func5的实现直接写在了.h里
--> 编译遇到错误, 提示func5()被重复定义, 于是在.h中为func5()加以static关键字修饰, 这样不管xx