首页 > 解决方案 > 包括在多个地方使用文件的守卫

问题描述

我可能在这里遗漏了一些明显的东西,但找不到什么。

我有一个 Utils.h 文件,其中包含我想在多个地方使用的实用程序函数。我知道避免重新定义编译器错误的方法是使用包含防护。

这是我所拥有的:

//----Utils.h----
#ifndef UH
#define UH
   void UtilFunc() { }
#endif

.

//----A.h----
class A {
   public:
      A();
      ~A();
};

.

//----A.cpp----
#include "A.h"
#include "Utils.h"

A::A() {
   UtilFunc();
}

A::~A(){ }

.

//----main.cpp----
#include "A.h"
#include "Utils.h"

int main() {
   A myA;
   UtilFunc();
   return 0;
}

我的 Visual Studio 项目只包含文件 A.cpp 和 main.cpp ,当我尝试编译时,我得到:

标签: c++visual-studioinclude

解决方案


两者都A.cpp包括main.cppUtils.h因此它们都有一个定义UtilFunc因为你在. 在一个程序中有多个非内联函数的定义违反了一个定义规则。链接器检测到它并抱怨它。 UtilFuncUtils.h

例如,您应该UtilFunc内联,或者将其定义放在单独的编译单元Utils.cpp中。

// Utils.h
#ifndef UH
#define UH
   void UtilFunc();
#endif
// Utils.cpp
void UtilFunc() {}

推荐阅读