如何使用.c文件代替.cpp文件在google测试中编写测试类?

luaexgnf  于 2023-01-16  发布在  Go
关注(0)|答案(1)|浏览(141)

bounty将在6天后过期。回答此问题可获得+50声望奖励。ThrowsError希望奖励现有答案

我已经使用googletest为我的Android NDK项目包含.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.

我该怎么解决这个问题?

sdnqo3pr

sdnqo3pr1#

不能使用.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
当你想在你的C单元测试代码中使用#include "some_header.h"时,你必须处理一个小的复杂问题,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" { ... }放在#include的C语言头文件周围,那么你将在链接时得到未定义符号的错误。
我建议您尝试使用包含以下三个文件的项目:

返回_一个.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

返回一个.c

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

int return_one(void)
{
    return 1;
}

测试返回一个.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的答案很有帮助。

相关问题