您不能使用.c
文件在 googletest 中编写测试类而不是.cpp
file.
A .c
文件应包含 C 语言源代码,C/C++ 编译器将假定.c
文件
被编译为C。
A .cpp
文件应包含 C++ 语言源代码,并且 C/C++ 编译器将假定.cpp
文件
将被编译为 C++。
C 和 C++ 是相关但不同的编程语言。 C 比 C++ 更古老、更简单。
C 语言中没有类。包含类的 C++ 源代码无法编译为 C。
Googletest 是一个用 C++ 而不是 C 编写的单元测试框架,它要求您编写
您的 C++ 测试代码,使用框架类。您的测试必须编码为.cpp
(and .h
)文件,以便
编译器会将它们编译为 C++。
然而,你can使用 googletest 对 C 代码进行单元测试。 C 代码将位于.c
and .h
文件,但你
必须编码你的单元测试,像往常一样,在.cpp
and .h
文件。 C/C++ 编译器知道
这.c
文件将被编译为 C 且.cpp
文件将被编译为 C++。
当你想要时,你必须处理一个小并发症#include "some_header.h"
在您的 C++ 单元测试代码中,以及some_header.h
是 C 语言头文件之一:
C++编译器将处理some_header.h
,和它can正确处理它只要
因为它知道 some_header.h
是一个C语言的头文件。通知 C++ 编译器some_header.h
是一个C头文件,你可以这样写:
extern "C" {
#include "some_header.h"
}
如果你不放extern "C" { ... }
周围的#include
对于 C 语言标头,您将得到 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 编译、链接和运行该项目。
您可能会找到以下问题的答案这个问题有帮助。