在多个cpp文件中包含带有定义的h文件

问题描述

我的问题是我有文件自定义单元测试框架),其中包含函数定义。例如:
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