gpt4 book ai didi

c++ - 为 C89 代码构建 C++ 单元测试

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:13 25 4
gpt4 key购买 nike

我希望这不会陷入死胡同,但这是我想做的。请让我知道这是否可行,或者您是否有其他好的(或更好的)方法。

我正在处理 C89 标准的遗留代码库(又是哪一年?),我想为软件的某些部分构建单元测试。我发现的 C 单元测试框架似乎不像 Catch 那样有用和简单。 C++ 中的框架,或者出于显而易见的原因实际上是大多数其他 C++ 单元测试框架。因此,我想用 C++ 构建这些单元测试。

存在一些自制程序构建过程,可以构建您正在处理的任何应用程序,所有这些都使用 C89 标准。构建该系统是因为项目之间存在许多共享依赖关系,并且这是在存在更好的替代方案之前创建的。我想做的是使用从该过程构建的工件链接到 C++ 单元测试应用程序。或者,我可以尝试找到所有依赖项并将它们构建到单元测试中,但这是 1. 重建冗余,2. 麻烦,以及 3. 删除它们的 C89 compiledness,我想维护它确保我正在测试的代码与它为最终用户运行的代码完全相同(使用 C89 而不是 C++ 编译)。

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

最佳答案

将评论转化为答案

在我看来,如果您为将被 C++ 单元测试代码利用的系统的所有部分提供合适的 header ,这应该是可行的。这些 header 应该可供 C++ 编译器使用,并且需要包装在 extern "C"{ 和匹配的 } 中。这可能在单元测试代码或主 (C) header 中完成(基于 #if defined(__cplusplus))。如果您没有可由 C++ 编译的 header ,那么在您拥有合适的 header 之前,这是不可能的。

Can I link my C++ unit test executable directly with the C89 objects? No worries about potential conflicts using different versions of the standard library in the same application?

您将链接到 C++ 编译器。您可能需要将 -lc 添加到链接行,但可能不需要。 C 库将与您使用的一样——没有单独的 C89 库、C99 库和 C11 库。因此,虽然您的测试代码是用 C89 编写的,并且您的代码测试是在 C++11 中,但 C 代码将使用当前的 C 库,而测试代码将使用 C++ 库。 C++ 代码将使用 C++ std 命名空间中的设施,因此您应该不会在那里遇到任何麻烦。也就是说,我还没有验证这一点,但这是编译器正确的事情。

有一本书Test Driven Development for Embedded C它推荐用于测试(嵌入式)C 代码的 C++ 单元测试框架。

关于c++ - 为 C89 代码构建 C++ 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25496092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com