c++ - C++项目:在哪里用函数定义全局变量
问题描述
我正在编写一个 C++ 项目,在某些时候,我需要生成一个随机数列表,我称之为“Zobrist”数字。我试图做这样的事情:
文件“zobrist.h”:
#ifndef ZOBRIST_H
#define ZOBRIST_H
namespace Zobrist
{
int ZOBRIST_NUMBERS[64];
bool ZOBRIST_NUMBERS_GENERATED;
void GENERATE_ZOBRIST_NUMBERS();
}
#endif // ZOBRIST_H
文件“zobrist.cpp”:
#include "zobrist.h"
bool Zobrist::ZOBRIST_NUMBERS_GENERATED = false;
void Zobrist::GENERATE_ZOBRIST_NUMBERS()
{
for (uint i=0; i!=64; ++i)
{
ZOBRIST_NUMBERS[i] = // Something
}
ZOBRIST_NUMBERS_GENERATED = true;
};
然后在我项目的其他几个文件中,我想包含“zobrist.h”并编写如下内容:
if (!Zobrist::ZOBRIST_NUMBERS_GENERATED) {Zobrist::GENERATE_ZOBRIST_NUMBERS();}
int x = Zobrist::ZOBRIST_NUMBERS[0] // etc.
但是,这不能编译,我不明白为什么。我收到类似的错误multiple definition of Zobrist::ZOBRIST_NUMBERS
。(我尝试在“zobrist.h”中加入一些“extern”关键词,但并没有解决错误。)
我哪里错了,正确的方法是什么?
解决方案
您的头文件包含多个变量的定义,并且该头文件包含在多个源文件中,因此多个源文件具有自己的这些变量的副本。然后,当您尝试链接已编译的目标文件时,会导致多定义错误。
您需要使用关键字在标头中声明变量extern
,然后在一个源文件中定义它们,可能是 zobrist.cpp。因此,您的标题将包含以下内容:
namespace Zobrist
{
extern int ZOBRIST_NUMBERS[64];
extern bool ZOBRIST_NUMBERS_GENERATED;
void GENERATE_ZOBRIST_NUMBERS();
}
并且 zobrist.cpp 将包含以下内容:
bool Zobrist::ZOBRIST_NUMBERS_GENERATED = false;
int Zobrist::ZOBRIST_NUMBERS[64];
推荐阅读
- java - 已解析的 Groovy 脚本的(反)序列化
- apache-nifi - 有没有办法以编程方式接收 NiFi 远程进程组的目标 uri?
- string - 如何转义 SPARQL 字符串中的括号?
- python - 如何在python中找到没有空格的字符串中的特定字符?
- python - SciSpacy 等效于 Gensim 的函数/参数
- google-apps-script - 如何在应用程序脚本中获取活动用户的电子邮件?[解决了]
- amazon-web-services - 使用 PVC 加密 EBS 卷而不会在 Kubernetes 内丢失数据
- cloud - 网格计算与分布式计算
- excel - 为什么我的数据透视表中存在一个描述为空的选择?
- asp.net - 是否有必要在您的项目中有 default.aspx 并作为 ASP.Net 中的起始页