繁体   English   中英

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

[英]Why does #ifndef not work in this situation?

注意:此问题已在此处直接回答

问题不包括警卫人员:他们不会在不同的翻译部门提供帮助


注意:我知道解决方案是使用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"不会执行任何操作,因为标头将从#ifndef CHESS跳到#endif 但这显然不是那样。 我为什么错了?

#ifndef仅在符号在#ifndef之前的同一翻译单元中定义的情况下才阻止代码。 转换单元是源文件(.cpp)以及包含在其中的所有文件。 由于您要编译两个源文件,因此它们都将完整包含.h文件。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM