为什么 #ifndef 在这种情况下不起作用?
Why does #ifndef not work in this situation?
注意:问题已经回答here不直接
The problem is not include guards : they won't help across different
translation units
注意:我知道解决方案是使用 extern
关键字。
我是 C++ 新手。我无法理解 header 文件中的 #ifndef
。当我这样做时,我收到一条错误消息,指出变量 game_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
时,定义了 CHESS
。所以在 bishop.cpp 中,#include "chess.h"
不会做任何事情,因为 header 会从 #ifndef CHESS
跳到 #endif
。但它显然不是那样工作的。为什么我错了?
如果符号是在同一个翻译单元中定义的,#ifndef
之前的某个点,#ifndef
只会阻塞代码。翻译单元是源文件 (.cpp) 和包含在其中的所有文件。由于您正在编译两个源文件,因此它们都将包含完整的 .h 文件。
您似乎已经知道如何处理在头文件中定义全局变量的问题:在头文件中声明它们 extern
,然后将定义放入其中一个源文件中。不过,如果我不首先警告您避免使用全局变量,那我就是失职了,因为随着程序的增长,它们会让您的生活变得困难。
注意:问题已经回答here不直接
The problem is not include guards : they won't help across different translation units
注意:我知道解决方案是使用 extern
关键字。
我是 C++ 新手。我无法理解 header 文件中的 #ifndef
。当我这样做时,我收到一条错误消息,指出变量 game_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
时,定义了 CHESS
。所以在 bishop.cpp 中,#include "chess.h"
不会做任何事情,因为 header 会从 #ifndef CHESS
跳到 #endif
。但它显然不是那样工作的。为什么我错了?
如果符号是在同一个翻译单元中定义的,#ifndef
之前的某个点,#ifndef
只会阻塞代码。翻译单元是源文件 (.cpp) 和包含在其中的所有文件。由于您正在编译两个源文件,因此它们都将包含完整的 .h 文件。
您似乎已经知道如何处理在头文件中定义全局变量的问题:在头文件中声明它们 extern
,然后将定义放入其中一个源文件中。不过,如果我不首先警告您避免使用全局变量,那我就是失职了,因为随着程序的增长,它们会让您的生活变得困难。