【问题标题】:how to use a .c file to write a test class in google test instead of .cpp file?如何使用 .c 文件在 google test 而不是 .cpp 文件中编写测试类?
【发布时间】:2014-05-14 05:49:50
【问题描述】:

我在我的 Android NDK 项目中使用了 googletest,其中包含 .c 文件。我使用了 .cpp 类型的测试类来做同样的事情。我想改用 .c 文件。尝试使用时出现以下错误:

Running main() from gtest_main.cc
[==========] Running 0 tests from 0 test cases.
[==========] 0 tests from 0 test cases ran. (1 ms total)
[  PASSED  ] 0 tests.

我该如何解决这个问题?

【问题讨论】:

  • 我不明白。您为什么要关心您的文件是否具有 .c 或 .cpp 文件扩展名?为什么不直接使用能够并且准确描述文件内容的那个?
  • 我遇到某些编译问题,无法识别类型转换错误:无法将参数“2”的“MyVersion {aka tagMYVersion}”转换为“MyStatus”运行时没有此类编译问题ndk-build 单独用于项目/当我在 .c 文件而不是 .cpp 中编译源代码时,因此想要一种使用 .c 文件运行 gtest 的方法
  • 所以它只适用于我的 c 代码的某些部分!

标签: c++ c unit-testing googletest


【解决方案1】:

您不能使用.c 文件代替.cpp 文件在googletest 中编写测试类。

.c 文件应包含 C 语言源代码,C/C++ 编译器将假定 .c 文件 将被编译为C。

.cpp 文件应包含 C++ 语言源代码,C/C++ 编译器将假定 .cpp 文件 将被编译为 C++。

C 和 C++ 是相关但不同的编程语言。 C 比 C++ 更古老、更简单。 C 语言中没有类。包含类的 C++ 源代码不能编译为 C。

Googletest 是一个用 C++ 而不是 C 编写的单元测试框架,它需要您编写 C++ 中的测试代码,使用框架类。您的测试必须在.cpp(和.h)文件中编码,以便 编译器会将它们编译为 C++。

但是,您可以使用 googletest 对 C 代码进行单元测试。 C 代码将在 .c.h 文件中,但你 必须像往常一样在.cpp.h 文件中编写您的单元测试。 C/C++ 编译器知道 .c 文件将被编译为 C,.cpp 文件将被编译为 C++。

当你想#include "some_header.h" 时,你必须处理一个小并发症 在您的 C++ 单元测试代码中,some_header.h 是 C 语言头文件之一:

C++ 编译器将处理some_header.h,它可以正确处理它 因为它知道 some_header.h 是一个C语言头文件。通知 C++ 编译器 some_header.h 是一个 C 头文件,你这样写:

extern "C" {
#include "some_header.h"
}

如果您不将 extern "C" { ... } 放在 C 语言标头的 #include 周围,那么您将获得 undefined-symbol 链接时出错。

我建议你尝试一个包含以下三个文件的项目:

return_one.h

// return_one.h
#ifndef RETURN_ONE_H
#define RETURN_ONE_H

// A C library :)

// A C function that always return 1.
extern int return_one(void);

#endif

return_one.c

// return_one.c
#include "return_one.h"

int return_one(void)
{
    return 1;
}

test_return_one.cpp

// test_return_one.cpp
#include "gtest/gtest.h"
extern "C" {
#include "return_one.h"
}

TEST(t_return_one, returns_1)
{
    EXPECT_EQ(1,return_one());  
}

int main(int argc, char **argv)
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

使用 googletest 编译、链接和运行此项目。

您可能会发现this question 的答案很有帮助。

【讨论】:

  • 当我尝试仅包含我的头文件而不包含要测试的 .c 文件时,错误:未定义对 '__FreeRetransmitterQueue' 的引用 collect2:ld 返回 1 退出状态 make.exe:** * [obj/local/armeabi/SmartTest] 错误 1
  • 当我包含我的 .c 文件时,我遇到了某些无法识别类型转换错误的编译问题:无法将参数“2”的“MyVersion {aka tagMYVersion}”转换为“MyStatus”
  • 当我包含我的 .c 文件时,我遇到了某些无法识别类型转换错误的编译问题:cannot convert 'MyVersion {aka tagMYVersion}' to 'MyStatus' for argument '2' there当我为项目单独运行 ndk-build 时/当我在 .c 文件而不是 .cpp 中编译源代码时,没有这样的编译问题
  • @user3054298 抱歉,我无法理解您的意思。如果您发布“我的 .c 文件”和产生错误的编译器命令行可能会有所帮助。
  • 我面临的问题是隐式类型转换在 C++ 编译器中无法识别,..所以我不得不修改我的 .c 文件并在每个地方都使用显式类型转换。有什么方法可以在不更改源代码的情况下解决这个问题?谢谢你的帮助
猜你喜欢
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 2016-01-30
  • 2013-06-23
  • 1970-01-01
  • 2012-04-23
相关资源
最近更新 更多