因为对单元测试工具比较熟悉,今天一个同事请我帮忙解决一个UT代码编译错误的问题。字面上错误大体是说有4个变量无法找到定义。
这里先说明,我们的产品代码使用C语言编写的,UT采用cpputest,UT采用C++风格编写。
首先,我让她简单介绍产品代码和UT代码。我发现这四个变量都是全局变量,在A.h中使用extern声明,同时在A.c中定义。然而出问题的被测代码是B.c所对应的UT,B.c引用了A.h头文件。直观来看貌似没有问题。
我试探性的让先她在UT代码开头直接引用A.c,很快发现A.c并没有引用A.h。之前听该同事介绍代码时没有发现问题,因为使用的是SourceInsight走查代码,该工具并没有严格按照语法规则决定声明和定义的关系来跳转。此外,不知道什么原因产品代码make的时候也没有报错。
修改之后重新编译,又解决了几个其他的编译问题之后,这4个变量顺利找到定义并运行通过。
我们的产品代码中关于全局变量误用引入的问题我还遇到过很多奇葩事:
- A.h中声明并且定义全局变量。在B.c和C.c中都引用A.h,试图使用这个全局变量。
- A.h中声明全局变量,在B.h中再次extern声明和定义这个变量。
现在,在很多公司,遇到一个追求完美编码的同行非常少了,很多都是能运行就行,或者只管自己使用方便就行。
其实,我非常不喜欢使用全局变量,好的代码应该严格遵守开放封闭原则,而全局变量的定义显然破坏了这一原则。我采用的方法一般是在定义静态变量,并且针对这个静态变量提供对外的操作接口,这样外部函数如果需要使用这个变量,完全可以通过统一的接口来调用。
但是,遗憾的是,我们代码中这样的全局变量非常普遍,而且要命的是,这种变量作为数据库存储大量的数据,很多不同的模块代码可以对其进行访问操作,风险很大。
一个全局变量的编译错误引出的思考,布布扣,bubuko.com
一个全局变量的编译错误引出的思考
原文:http://blog.csdn.net/walle_love_eva/article/details/20640411