错误LNK2005:已经定义了包含头文件两次
error LNK2005: already defined on including a header file twice
我需要在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
。
相关文章:
- C++两次从文件保存对象读取多重继承
- 带有文件结束函数的 while 循环重复输出文件中的最后一个数字两次
- 如何使用预处理器指令包含两次具有不同代码的文件?
- 使用字符串流逐行读取文件两次
- C OOP,读取文件的问题,EOF使用了两次,排行榜
- Qfiledialog:文件夹名称在Windows下方出现两次
- 是否值得两次通过文件进行迭代,以创建最小的数据结构
- 为什么输入文件的最后一行运行两次?
- 为什么在这里对c++输入文件流进行两次检查
- 锁定文件,避免使用相同的过程以访问两次
- 尽管 #ifndef,但包含两次头文件
- CppUnit 和 CMake:.cpp文件被编译两次
- 正在从文件中读取最后两次出现的内容
- 流将所有内容写入我的文件两次
- NodeJS 文件系统 监视抛出事件两次或更多次
- 我的文件正在输出到屏幕两次 C++
- 文件在add_custom_command后source_group中添加了两次
- 错误LNK2005:已经定义了包含头文件两次
- 如何在一行中读取相同的文件两次
- 我如何配置cmake编译一个文件两次与两个不同的编译器