今天往工程里添加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关键字修饰, 这样不管xxx.h为包含在哪个文件里, 铺开的func5()都是static的只在包含它的文件里可见, 这样果然不重复定义了.
--> static"很好", 于是为库中所有函数添加static修饰
--> 其中一些函数在工程中没有被调用过, 所以加了static也没影响; 另一些在工程中被多次调用过的, 假设为func3(), 这时会提示找不到函数定义, 于是该猿把声明和定义本来很规范的fun3()的定义在cpp中注释掉, 添加到.h中, 于是该错误果然消失了.
--> 该库中大部分还是没被调用过的, 于是他只对少量几个函数做了这样修改, 整个工程可以编译通过了.
------------------------------------------------------------------------------------------------------------------------------------------
于是, 当我添加的Log.cpp文件中调用了原来整个工程都没有调用过的xxx.h中的函数时, 产生了这么一系列问题....
请遵守良好的编程风格和规范.
请遵守好的编程风格 -- 关于.h文件去写函数的具体实现