问题描述
我的问题是我有头文件(自定义单元测试框架),其中包含函数定义。例如:
unit_test.h:
#pragma once
...
void Assert(bool b,const string& hint = {})
{
AssertEqual(b,true,hint);
}
...
对我来说,在标头中保留一些定义的函数对我来说很方便,因为我经常通过简单地包含(unit_test.h
位于单独的目录C:/Dev/include
中来使用此函数。
但是如果我正在处理一个项目,其中多个cpp文件使用此功能,则会收到预期的多定义错误。
简单的项目如下所示:
main.cpp:
#include "unit_test.h"
void foo();
int main()
{
Assert(1);
foo();
return 0;
}
foo.cpp:
#include "unit_test.h"
void foo()
{
Assert(2);
}
所以我想知道是否有正确的方法将函数定义保存在头文件中,并在项目中使用它而不会出现多定义错误?
(还是最好将移动函数定义到源并每次分别编译,还是将unit_test编译到静态库中?)
解决方法
最简单的方法是在函数定义中添加inline
关键字,但这不是最佳解决方案。
最好的选择是将定义移至源文件,但这并不是模板。
,我将内联使用匿名名称空间:
namespace {
inline void Assert(bool b,const string& hint = {})
{
AssertEqual(b,true,hint);
}
}
,
此错误是因为只要您包含该文件,它将再次定义该函数。解决方案是仅创建一个带有声明的头文件 unit_test.h ,然后创建一个用于定义的源文件 unit_test.cpp 。现在您可以包含头文件了,它不会出错。不要忘记在标题中添加#ifndef,如下所示
unit_test.h
#ifndef UNIT_TEST_H_
#define UNIT_TEST_H_
// Declare you function
// and end with:
#endif