C++ 构建C++;C89代码的单元测试

C++ 构建C++;C89代码的单元测试,c++,c,unit-testing,C++,C,Unit Testing,我希望这不会成为一条死胡同,但以下是我想做的。请让我知道这是否有可能,或者您是否有其他好的(或更好的)方法 我正在开发一个C89标准的遗留代码库(又是哪一年?),我想为软件的某些部分构建单元测试。我发现的C单元测试框架似乎不像C++中的框架那样有用和简单,或者是其他大多数C++单元测试框架的原因。因此,我想在C++中构建这些单元测试。 存在一些自制的构建过程,可以构建您正在使用的任何应用程序,所有这些都使用C89标准。该系统的建立是因为项目之间存在许多共享依赖关系,而这是在更好的替代方案存在之前

我希望这不会成为一条死胡同,但以下是我想做的。请让我知道这是否有可能,或者您是否有其他好的(或更好的)方法

我正在开发一个C89标准的遗留代码库(又是哪一年?),我想为软件的某些部分构建单元测试。我发现的C单元测试框架似乎不像C++中的框架那样有用和简单,或者是其他大多数C++单元测试框架的原因。因此,我想在C++中构建这些单元测试。 存在一些自制的构建过程,可以构建您正在使用的任何应用程序,所有这些都使用C89标准。该系统的建立是因为项目之间存在许多共享依赖关系,而这是在更好的替代方案存在之前建立的。我想做的是使用从那个过程构建的工件链接到C++单元测试应用程序。或者,我可以尝试查找所有依赖项并将它们构建到单元测试中,但这是1。需要重建,2。笨重的,和3。删除它们的C89可编译性,我希望对其进行维护,以确保我正在测试的代码与为最终用户运行的代码完全相同(用C89而不是C++编译)


使用相同的编译器(gcc),这是可能实现的,还是我一直使用C单元测试框架?无论哪种方式,一些技术解释都会非常有用,因为我不太熟悉不同语言和标准库工件之间的差异(除了库本身不同之外)。另外,注意到,此时更改生成过程是(不可行的)(在预算中):

代码很容易被包含在C++项目中,只需通过链接C对象文件(.o,a)。C头文件包含在用ExtN“C”封装的C++项目中,例如

您可能会遇到奇怪的编译和运行时问题。注意一些C遗留代码的问题,如#定义
bool
和用自定义内存管理方案替换分配器

将评论转换为答案


我认为,如果您有适合C++系统单元测试代码开发的系统的所有部分,则应该是可行的。这些头文件应该由C++编译器使用,并且需要封装在代码>外部“C”{< /C> >和匹配<代码> }/COD>。这可以在单元测试代码内部或在主(C)头中完成(基于

#,如果定义(u cplusplus)
)。如果没有可由C++编译的头文件,那么在您有适当的标题之前,它是不可能的。 <>我可以直接将C++单元测试与C89对象链接吗?不用担心在同一应用程序中使用不同版本的标准库可能会发生冲突


<>你将与C++编译器联系起来。您可能需要将
-lc
添加到链接行,但可能不会。C库将与您使用的库相同-没有单独的C89库、C99库和C11库。所以,虽然你的测试代码被写入C89,而你的代码测试在C++ 11中,C代码将使用当前的C库,测试代码将使用C++库。C++代码将使用C++ STD命名空间中的设施,因此您不应该在那里遇到任何麻烦。这就是说,我还没有验证过这一点,但这是编译器应该做的事情


<> P.>有一本书推荐了C++单元测试框架来测试(嵌入式)C代码。在我看来,如果你有适合C++系统单元测试代码开发的系统的所有部分,那么它应该是可行的。这些头文件应该由C++编译器使用,并且需要封装在代码>外部“C”{< /C> >和匹配<代码> }/COD>。这可以在单元测试代码内部或在主标题中完成(基于
#如果定义(u cplusplus)
)。如果你没有可以由C++编译的页眉,那么在你有合适的标题之前,它是不可能的。但是我能直接把C++的单元测试与C89对象链接起来吗?不用担心在同一应用程序中使用不同版本的标准库可能会发生冲突?您可能需要在链接行中添加
-lc
,但可能不会。C库将与您使用的库相同-没有单独的C89库、C99库和C11库。所以,虽然你的测试代码被写入C89,而你的代码测试在C++ 11中,C代码将使用当前的C库,测试代码将使用C++库。C++代码将使用C++ <代码> STD< /Cord>命名空间,因此不应在那里遇到任何麻烦。这就是说,我还没有验证过这一点,但这正是编译器所做的事情。嗯,在一个简单的测试用例中,我完全能够做我想要做的事情(奇怪的是,没有用extern导入头。这会导致未定义的引用错误…)。这是可疑的容易得到工作,所以我明天将尝试一个现实的例子,并报告任何问题(希望没有)。我想我应该在问之前试一下,但我想我会去一个不虔诚的兔子洞……幸运的是,没有不虔诚(甚至是神圣)的兔子洞。有一本书推荐C++单元测试框架来测试(嵌入)C代码。
extern "C" {
#include "my_c_header.h"
}