为什么#ifndef在这种情况下不起作用?

时间:2015-02-17 19:58:31

标签: c++ redefinition

注意:问题已经被here直接回答

  

问题不包括警卫:他们不会帮助不同   翻译单位


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

我是C ++的新手。我在头文件中理解#ifndef时遇到问题。当我做这样的事情时,我收到一个错误,说已经定义了变量game_overturn

/*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时,CHESS已定义。所以在bishop.cpp中,#include "chess.h"不会执行任何操作,因为标题会从#endif跳到#ifndef CHESS。但它显然不能那样工作。为什么我错了?

1 个答案:

答案 0 :(得分:2)

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

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