请遵守好的编程风格 -- 关于.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中的函数时, 产生了这么一系列问题....

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

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

时间: 2024-10-17 09:06:18

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

.c和.h文件的区别(转载)

一个简单的问题:.c和.h文件的区别学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼:子程序不要定义在.h中.函数定义要放在.c中,而.h只做声明.否则多引用几次,就会发生函数重复定义的错误. 3楼:.h只做声明,编译后不产生代码 4楼: 这样做目的是为了实现软件的模块化使软件结构清晰,而且也便于别人使用你写的程序 纯粹用 C 语言语法的角度,你当然可以在 .h 中放任何东西,因为 #include

.c和.h文件的区别(头文件与之实现文件的的关系~ )

 .c和.h文件的区别 一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定义在.h中. 函数定义要放在.c中,而.h只做声明.否则多引用几次,就会发生函数重复定义的错误. 3楼: .h只做声明,编译后不产生代码   4楼: 这样做目的是为了实现软件的模块化 使软件结构清晰,而且也便于别人使用你写的程序 纯粹用 C 语言语法的角度,你当然可以在 .h

Swift 编程风格指南(raywenderlich.com 版本号)

官方 raywenderlich.com Swift 编程风格指南 本文版权归 raywenderlich.com .The Official raywenderlich.com Swift Style Guide项目以及全部贡献者全部. 译者翻译仅供知识传播使用. 本风格指南的目标是让Swift代码更简洁.可读更强. 语言 推荐使用跟苹果API文档风格统一的英语. 推荐: var color = "red" 不推荐: var colour = "red" 空白 使

VS error LNK2019: 无法解析的外部符号 " h文件和cpp文件链接不上

同时存在.h和.cpp,cpp中函数已经定义,依旧提示无法解释的外部符号 VS中对文件有中表示,可以通过选中.h或.cpp文件,右键,属性--通常--项类型中 C/C++标头是针对头文件的,C/C++编译器是针对cpp文件,根据这个改正就好了 这次出现的原因应该是本人一开始在.h文件中定义函数,而没有创建一个cpp文件,VS把它当成cpp来用吧 后来本人又创建了一个cpp文件,C/C++编译器属性被.h文件占用了,cpp文件就不认识了

转载:每一个程序员要遵守的一些优秀编程风格

无论你是业余的还是专业的程序员,正确的编程风格,不但有助于提升软件产品的功能,还可以明显减少软件灾难的产生.今天,我们就来探讨一下有助于我们获取更佳编程风格的一些最好的规则. 每一个程序员要遵守的一些优秀编程风格 代码的可读性至上 代码要能可阅读和可理解,就需要格式化成一致的方式.对函数和变量的命名应有意义,注释的表达应该简洁而准确.并且,准确地记录代码中所有棘手的部分是十分重要的.你必须清楚软件程序为什么能工作以及为什么能在所有可能的情况下顺利工作的原因. 遵循正确的命名约定是必须的 当需要给

程序员要遵守的一些优秀编程风格

无论你是业余的还是专业的程序员,正确的编程风格,不但有助于提升软件产品的功能,还可以明显减少软件灾难的产生.今天,我们就来探讨一下有助于我们获取更佳编程风格的一些最好的规则. 代码的可读性至上 代码要能可阅读和可理解,就需要格式化成一致的方式.对函数和变量的命名应有意义,注释的表达应该简洁而准确.并且,准确地记录代码中所有棘手的部分是十分重要的.你必须清楚软件程序为什么能工作以及为什么能在所有可能的情况下顺利工作的原因. 遵循正确的命名约定是必须的 当需要给类.函数和变量命名时,你需要遵循以下指

每一个程序员要遵守的一些优秀编程风格

无论你是业余的还是专业的程序员,正确的编程风格,不但有助于提升软件产品的功能,还可以明显减少软件灾难的产生.今天,我们就来探讨一下有助于我们获取更佳编程风格的一些最好的规则. 代码的可读性至上 代码要能可阅读和可理解,就需要格式化成一致的方式.对函数和变量的命名应有意义,注释的表达应该简洁而准确.并且,准确地记录代码中所有棘手的部分是十分重要的.你必须清楚软件程序为什么能工作以及为什么能在所有可能的情况下顺利工作的原因. 遵循正确的命名约定是必须的 当需要给类.函数和变量命名时,你需要遵循以下指

Qt的编程风格与规范

Qt的编程风格与规范 来源: http://blog.csdn.net/qq_35488967/article/details/70055490 参考资料: https://wiki.qt.io/Qt_Contribution_Guidelines https://wiki.qt.io/Qt_Coding_Style https://wiki.qt.io/Coding_Conventions https://community.kde.org/Policies/Library_Code_Poli

Google C++编程风格指南

一.头文件 1. #define的保护:所有头文件都应该使用#define防止头文件被多重包含(multiple inclusion),命名格式: <PROJECT>_<PATH>_<FILE>_H_ 为保证唯一性,头文件的命名应基于其所在项目源代码树的全路径. 2.头文件依赖:使用前置声明(forward declarations)尽量减少.h文件中#include的数量.避免多米诺骨牌效应 e.g.头文件中用到类File,但不需要访问File的声明,则头文件只需前置