C++ 为什么在这种情况下,ifndef不起作用?

C++ 为什么在这种情况下,ifndef不起作用?,c++,redefinition,C++,Redefinition,注:该问题已被间接回答 问题不在于包括警卫:他们不会在不同的地方提供帮助 翻译单位 注意:我知道解决方法是使用extern关键字。 我是C++新手。我在理解头文件中的#ifndef时遇到问题。当我这样做时,我得到一个错误,即变量game\u over和turn已经定义 /*chess.h*/ #ifndef CHESS #define CHESS #include <iostream> #include "chessboard.h" using namespace std; bo

注:该问题已被间接回答

问题不在于包括警卫:他们不会在不同的地方提供帮助 翻译单位


注意:我知道解决方法是使用
extern
关键字。

我是C++新手。我在理解头文件中的
#ifndef
时遇到问题。当我这样做时,我得到一个错误,即变量
game\u over
turn
已经定义

/*chess.h*/
#ifndef CHESS
#define CHESS
#include <iostream>
#include "chessboard.h"
using namespace std;

bool game_over;
char turn;
chessboard board;

int main();
#endif

/*bishop.cpp*/
#include "bishop.h"
#include "chess.h"
bishop::bishop(string pos, char color)
{
    int x = pos[0] - 97;
    int y = pos[1] - 1;
    name = "bishop";
    this->color = color;
    board.add_new(*this);
}

/*chess.cpp*/
#include "chess.h"

int main()
{
    ...
}
/*chess.h*/
#国际象棋
#下棋
#包括
#包括“chessboard.h”
使用名称空间std;
游戏结束了;
炭化;
棋盘;
int main();
#恩迪夫
/*主教*/
#包括“bishop.h”
#包括“chess.h”
bishop::bishop(字符串位置,字符颜色)
{
int x=位置[0]-97;
int y=位置[1]-1;
name=“bishop”;
这个->颜色=颜色;
董事会。新增(*本);
}
/*chess.cpp*/
#包括“chess.h”
int main()
{
...
}
为什么变量在这里定义了两次?我想第一次当包含
chess.h
时,定义了
chess
。因此,在bishop.cpp中,
#include“chess.h”
将不起任何作用,因为标题将从
#ifndef chess
跳到
#endif
。但它显然不是这样工作的。为什么我错了?

如果符号定义在同一翻译单元中,则
#ifndef
仅会在
#ifndef
之前的某个点阻止代码。翻译单位是源文件(.cpp)及其包含的所有文件。由于您正在编译两个源文件,因此它们都将包含一个完整的.h文件


您似乎已经知道如何处理在头文件中定义全局变量的问题:在头文件中声明它们
extern
,并将定义放入其中一个源中。不过,如果我没有首先警告您避免使用globals,那我就是失职了,因为随着您的程序的增长,它们会使您的生活变得困难。

您是否有任何其他源文件也包含与此链接的“chess.h”?您是否将此文件包含在多个cpp文件中?如果是这样,每一个都会有变量声明。是的,我有。所以我不明白为什么我们要使用#ifndef,如果它不能阻止这个问题的发生?
int main()#endif
真的吗?O_O,,,可能重复的