C++项目:在哪里用函数定义全局变量
C++ project: Where to define global variable with function
我正在编写一个 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”关键字,但并没有解决错误。)
我哪里出错了,正确的方法是什么?
您的header文件包含定义几个变量,header包含在多个源文件中,所以多个源文件有自己的副本这些变量。当您随后尝试 link 已编译的 object 文件时,会导致多重定义错误。
您需要使用 extern
关键字 声明 header 中的变量,然后在一个源文件中定义它们,可能 zobrist.cpp.所以你的 header 会包含这个:
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];
我正在编写一个 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”关键字,但并没有解决错误。)
我哪里出错了,正确的方法是什么?
您的header文件包含定义几个变量,header包含在多个源文件中,所以多个源文件有自己的副本这些变量。当您随后尝试 link 已编译的 object 文件时,会导致多重定义错误。
您需要使用 extern
关键字 声明 header 中的变量,然后在一个源文件中定义它们,可能 zobrist.cpp.所以你的 header 会包含这个:
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];