首页 > 代码库 > 请遵守好的编程风格 -- 关于.h文件去写函数的具体实现

请遵守好的编程风格 -- 关于.h文件去写函数的具体实现

今天往工程里添加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中的函数时, 产生了这么一系列问题....


请遵守良好的编程风格和规范.