错误LNK2005:已经定义了两次包含头文件

时间:2015-10-08 12:18:59

标签: c++ visual-studio-2013 namespaces include lnk2005

我需要在visual studio项目中编辑和访问多个cpp文件中的一些变量。所以我创建了一个带有命名空间的头文件,其中包含我需要的所有变量,如下所示:

namespace windowdimension{
    TCHAR openwindows[20][180];
    int winnum = 0;
    int windowleft = 0;
    int windowright = 1360;
    INT windowtop = 0;
    INT windowbottom = 768;
    LONG leftarray[20];
    LONG rightarray[20];
    LONG toparray[20];
    LONG bottomarray[20];

}

但是如果我在两个源文件中#include这个头文件,我得到这个链接器错误2005,说该参数已经在另一个obj中定义。

在提到同一错误的其他问题时,我知道here

  

函数定义只能出现一次。 #include你的.h文件的每个.cpp文件都会生成另一个函数副本。

但这也适用于命名空间变量吗? 如果是这样,我们如何确保跨多个源文件访问特定变量?

2 个答案:

答案 0 :(得分:2)

您永远不应在头文件中定义全局变量。

为了能够共享,您需要在头文件中声明它们(使用extern关键字),并在.cpp文件中仅定义一次。

当然,永远不要忘记在每个头文件中包含警卫(#pragma once是非常便携的解决方案):

global.hpp

#pragma once

namespace global {
   extern int variable;
}

global.cpp

namespace global {
   int variable = 0;
}

无论如何,使用全局变量是一种非常糟糕的做法。

答案 1 :(得分:1)

您可能忘了添加 include guard

Header.h

#ifndef HEADER_H
#define HEADER_H

namespace something {
}

#endif

另一种选择是在头文件的最开头使用#pragma once