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

error LNK2005: already defined on including a header file twice

本文关键字:文件 两次 包含头 LNK2005 定义 错误      更新时间:2023-10-16

我需要在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说参数已经在另一个对象中定义。

参考同样错误的其他问题,我在这里了解到

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

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

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

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

当然,永远不要忘记在每个头文件中包含保护(#pragma once是非常可移植的解决方案):

global.hpp

#pragma once
namespace global {
   extern int variable;
}

global.cpp

namespace global {
   int variable = 0;
}

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

您可能忘记添加include guard:

Header.h

#ifndef HEADER_H
#define HEADER_H
namespace something {
}
#endif

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