首页 > 解决方案 > 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”关键词,但并没有解决错误。)

我哪里错了,正确的方法是什么?

标签: c++compiler-errorsglobal-variablesproject

解决方案


您的头文件包含多个变量的定义,并且该头文件包含在多个源文件中,因此多个源文件具有自己的这些变量的副本。然后,当您尝试链接已编译的目标文件时,会导致多定义错误。

您需要使用关键字在标头中声明变量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];

推荐阅读