在grid.h中,我有
#ifndef __GRID_H__
#define __GRID_H__
#include "block.h"
extern char **theBoard;
extern Block* blocks[40];
#endif
在我的" board.h"文件,我有(缩写)
#include "block.h"
class Board
{
....
char **theBoard;
Block* blocks[40];
....
}
在我的" board.cpp"文件,我已经初始化了theBoard和blocks(缩写)
#include "board.h"
#include "grid.h"
theBoard = new char*[18];
for(int i=0; i<18; i++){
theBoard[i] = new char[10];
for(int j=0; j<10; j++){
theBoard[i][j] = ' ';
}
}
for (int i = 0; i < 40; i++)
blocks[i] = 0;
在我的&#34; block.h&#34;文件我有(缩写)
class Block
{
....
char **theBoard;
Block* blocks[40];
....
}
在我的&#34; block.cc&#34;文件,我有(缩写)
#include "grid.h"
#include "block.h"
//somewhere in the file I try to read theBoard[1][1]
我的程序在尝试读取block.cc中的Board [1] [1]时崩溃了。将调试器的监视窗口放在theBoard上会显示当程序在block.cc中运行指令时它指向垃圾
代码就是这样,因为我试图按照其他人在此处发布的类似问题中针对相同问题给出的答案中给出的说明进行操作。
我试图在包含grid.h的每个文件中使用grid.h中声明的全局变量。
有人能告诉我在使用全局变量时出错吗?
由于
答案 0 :(得分:1)
在全局范围内拥有变量声明并不会神奇地促进该标识符的所有其他用法来访问全局变量。相反,对其他范围中的变量使用相同的名称将隐藏全局。 (它仍然可以通过限定名称访问)
在你的程序中,你同时声明::theBoard
,一个全局变量,Block::theBoard
,一个非class Block
的非静态成员变量。同样适用于::blocks
和Block::blocks
。
在class Block
及其成员函数内部,非限定使用theBoard
和blocks
将引用该成员。在外面,不合格的用法将指全球。
全局变量声明(使用extern
)还需要一个匹配的定义,该定义必须在全局范围内,只需要一个编译单元(不要将定义放入头文件中)。这就是导致链接器为变量分配内存的原因。