我希望这不会走向死胡同,但这就是我想做的事情。如果这种情况可以远程实现,或者您有其他好的(或更好的)方法,请告诉我。
我正在研究C89标准的遗留代码库(又是哪一年?),我想为软件的某些部分构建单元测试。我发现的C单元测试框架似乎并不像C ++中的Catch框架那样有用和简单,或者出于显而易见的原因,它实际上是大多数其他C ++单元测试框架。因此,我想用C ++构建这些单元测试。
存在一些自制的构建过程,它将构建您正在使用的任何应用程序,所有这些都使用C89标准。系统的构建是因为项目之间存在大量共享依赖关系,而这是在存在更好的替代方案之前做出的。我想要做的是使用从该进程构建的工件链接到C ++单元测试应用程序。或者,我可以尝试找到所有的依赖关系并将它们构建到单元测试中,但是重建是多余的,2。繁琐的,以及3.删除它们的C89编译,我和#39 ; d喜欢维护以确保代码我的测试与最终用户运行的完全相同(使用C89编译,而不是C ++编译)。
使用相同的编译器(gcc),这可能是完成,还是我坚持使用C单元测试框架?任何一种技术解释都非常有用,因为我不太熟悉不同语言和标准库工件之间的差异(除了库本身不同)。此外,请注意,此时更改构建过程(遗憾的是)不可行(阅读:在预算中)。
答案 0 :(得分:1)
只需链接C对象文件(.o,.a),就可以轻松地将代码包含在C ++项目中。 C头文件包含在用extern" C"包裹的C ++项目中,例如
extern "C" {
#include "my_c_header.h"
}
您可能会遇到奇怪的编译和运行时问题。留意一些C遗留代码,如#defining bool
,并用自定义内存管理方案替换分配器。 -_-'
答案 1 :(得分:1)
将评论转换为答案
在我看来,只要你有适合系统的所有部分的标题,C ++单元测试代码将利用它,它应该是可行的。这些头文件应该可以被C ++编译器使用,并且需要包含在extern "C" {
和匹配的}
中。这可以在单元测试代码内或主(C)头中完成(基于#if defined(__cplusplus)
)。如果你没有可以用C ++编译的标题,那么除非你有合适的标题,否则它是不可能的。
我可以直接将C ++单元测试可执行文件与C89对象链接吗?不用担心在同一个应用程序中使用不同版本的标准库会发生潜在冲突吗?
您将链接到C ++编译器。您可能需要将-lc
添加到链接行,但可能不会。无论如何,C库将与您使用的相同 - 没有单独的C89库和C99库以及C11库。因此,虽然您的测试代码是写入C89的,而您的代码测试是在C ++ 11中,但C代码将使用当前的C库,测试代码将使用C ++库。 C ++代码将使用C ++ std命名空间中的工具,因此您不应该遇到任何麻烦。也就是说,我没有对此进行验证,但编译器正确的做法就是这样。
有一本书Test Driven Development for Embedded C,它推荐用于测试(嵌入式)C代码的C ++单元测试框架。