我有一个全球static int xMax
。当我将xMax
的值分配给本地int xLoc
时,它返回零,即分配失败。
int xLoc = xMax;
将xLoc
设为0
;如果我以其他方式使用xMax
,我会遇到类似的问题,例如在for循环for (int i = 0 i < xMax; i++)
中,循环被跳过。
为什么会这样,我如何解决这个问题,以便xMax
可以用作全局变量?
注意:最初我分配了int xMax;
,但这导致了链接器错误
LNK2005“int GameFunc :: xMax”(...)已在board.obj中定义
在xMax
中声明int board.h
是正确的,但只有那里和其他地方都没有。制作xMax
static
是修复链接器错误MSDN的建议选项之一,确实有效,但会产生上述不良后果。
board.h
namespace GameFuncs
{
static int xMax; // global x and y dimensions of the board
static int yMax;
class Square
{
public:
// getters, setters, methods
private:
// variables
};
}
board.cpp
namespace GameFuncs
{
void Board::Print()
{
for (int r = 0; r < xMax; r++) // for each row
{
// do something
}
}
}
这是一组文件中的一个类,它们共同构成.dll
。即使在调试器中它具有指定值(10),上面循环中的xMax也会计算为0。
答案 0 :(得分:3)
如果您已将其标记为static
,那么您已创建了一个只能在该源文件中看到的同名新符号。它与其他地方xMax
不一样,因此不会有相同的价值。
将某些内容放入.h文件中与将其复制并粘贴到每个源文件中基本相同。因此,如果您的标头中有int xMax
,则与每个文件中都有一个static
相同。然后因为他们不是extern int
(即范围受限制),就会发生冲突。
您的标题中可能需要extern
({{1}}声明该符号存在,但不会尝试定义它)以及源文件中的单个非extern声明。
答案 1 :(得分:0)
在将静态变量赋值给局部变量之前,请确保为静态变量赋值,否则static int的默认值为0。