我正在重构一些C代码并对已提取的部分执行单元测试(使用Google Test)。一个片段在循环中被多次使用,因此为了将其暴露给测试,我将其作为内联函数提取到头文件demo.h
中,该头文件还包括一些其他非inline
函数的声明。简化版本如下:
#ifndef DEMO_H_
#define DEMO_H_
#ifdef __cplusplus
extern "C" {
#endif
inline void print_line(FILE* dest, const double * data, int length) {
for (int s = 0; s < length; s++)
fprintf(dest, "%lf ", data[s]);
fprintf(dest, "\n");
}
#ifdef __cplusplus
}
#endif
#endif /* MK_H_ */
我的测试代码
#include "gtest/gtest.h"
#include "demo.h"
#include <memory>
#include <array>
#include <fstream>
TEST (demo, print_line) {
std::array<double,4> test_data = {0.1, 1.4, -0.05, 3.612};
const char* testfile = "print_line_test.txt";
{
auto output_file = std::unique_ptr<FILE, decltype(fclose)*>{
fopen(testfile, "w"), fclose };
print_line(output_file.get(), test_data.data(), test_data.size());
}
std::ifstream input(testfile);
double dval;
for(const auto& v: subsequence_data) {
input >> dval;
EXPECT_EQ (v, dval);
}
EXPECT_FALSE (input >> dval) << "No further data";
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
在MinGW g++ 4.8.1下,使用-std=gnu++0x
编译该代码可以很好地运行。
然后,原始的C代码就会使用这个函数。简化版本如下所示:
#include "demo.h"
void process_data(const char* fname, double ** lines, int num_lines, int line_length) {
FILE* output_file = fopen(fname, "w");
for (int i=0; i<num_lines; ++i) {
print_line(output_file, lines[i], line_length);
}
}
然而,当我使用MinGW GCC 4.8.1编译我的C代码时,使用-std=c99
,我会收到以下警告:
警告:'fprintf'是静态的但在非静态函数'print_line'中使用[默认情况下启用]。
我还会得到一个后续错误,可能与此有关:
对`print_line'的未定义引用
在头文件中更改签名为static inline void print_line ...
似乎可以解决问题。然而,我不喜欢不理解这个问题的原因。为什么缺少static
不影响C ++测试?关于fprintf
的错误实际上意味着什么?