在多个 cpp-files 中包含带有定义的 h-file
Include h-file with definitions inside in multiple cpp-files
我的问题是我有 header-file(自定义 unit-test 框架),其中包含函数定义。例如:
unit_test.h:
#pragma once
...
void Assert(bool b, const string& hint = {})
{
AssertEqual(b, true, hint);
}
...
将一些函数定义在 header 中对我来说很方便,因为我经常通过简单地包含来使用这个函数(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);
}
所以我想知道是否有正确的方法将函数定义保存在 header 文件中并在项目中使用它而不会出现多重定义错误?
(还是把函数定义移到源码里,每次单独编译,还是把unit_test编译成静态库更好?)
实现它的最简单方法是在函数定义中添加 inline
关键字,但这不是最佳解决方案。
最好的选择是将定义移动到源文件,但只有它不是模板。
我会使用带内联的匿名命名空间:
namespace {
inline void Assert(bool b, const string& hint = {})
{
AssertEqual(b, true, hint);
}
}
这个错误是因为每当你包含文件时它会再次定义函数。解决方案是制作一个仅包含声明的 header 文件 unit_test.h 并创建一个源文件 unit_test.cpp定义。现在您可以包含 header 文件,它不会出错。不要忘记在 header 中添加 #ifndef,如下所示
unit_test.h
#ifndef UNIT_TEST_H_
#define UNIT_TEST_H_
// Declare you function
// and end with:
#endif
我的问题是我有 header-file(自定义 unit-test 框架),其中包含函数定义。例如:
unit_test.h:
#pragma once
...
void Assert(bool b, const string& hint = {})
{
AssertEqual(b, true, hint);
}
...
将一些函数定义在 header 中对我来说很方便,因为我经常通过简单地包含来使用这个函数(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);
}
所以我想知道是否有正确的方法将函数定义保存在 header 文件中并在项目中使用它而不会出现多重定义错误?
(还是把函数定义移到源码里,每次单独编译,还是把unit_test编译成静态库更好?)
实现它的最简单方法是在函数定义中添加 inline
关键字,但这不是最佳解决方案。
最好的选择是将定义移动到源文件,但只有它不是模板。
我会使用带内联的匿名命名空间:
namespace {
inline void Assert(bool b, const string& hint = {})
{
AssertEqual(b, true, hint);
}
}
这个错误是因为每当你包含文件时它会再次定义函数。解决方案是制作一个仅包含声明的 header 文件 unit_test.h 并创建一个源文件 unit_test.cpp定义。现在您可以包含 header 文件,它不会出错。不要忘记在 header 中添加 #ifndef,如下所示
unit_test.h
#ifndef UNIT_TEST_H_
#define UNIT_TEST_H_
// Declare you function
// and end with:
#endif