我现在用Google搜索了大约30分钟,并没有发现与我的问题相关的任何内容:
我使用Visual Studio C ++ 2008,它为我声明了一个名为“stdafx.h”的标题 在这个标题中我声明了我需要的所有东西,我想要全局变量也在那里,但是当我想使用其中一个变量时,我得到一个错误(在编译时) 我的“stdafx.h”看起来像这样:
#pragma once
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
windows header here....
// C RunTime Header Files
compiler related standard headers here....
// TODO: reference additional headers your program requires here
#ifndef aaab
#include "codename.hpp"
#define aaab
#endif
// and a load of other headers (all of my project) followed here
...
...
...
在声明之后我定义了我的全局变量:
Game *game;
我想在“codename.cpp”中使用它们
这里是班级的简短视图
#include "stdafx.h"
#define MAX_LOADSTRING 100
other class related stuff here....
main function here....
void test()
{
game = new Game(); // HERE IS THE ERROR
}
答案 0 :(得分:8)
您可能需要在头文件中声明全局为extern
:
extern Game *game;
然后在.cpp文件中定义它。
答案 1 :(得分:1)
以下是一些处理全局变量的方法:
在任何情况下,首选方法是在头文件中声明变量,并在源文件中定义。
这比在全局命名空间中声明的变量更好,因为它降低了与其他变量冲突的可能性并减少了其他功能的污染。
示例:
namespace Math_Globals
{
int a_math_int;
}
其他语言不允许全局变量,因此必须将它们集群到一个类中。使它们在类中静态,而类static只提供一个实例。与 singleton 模式类似。
此设计允许您对全局变量进行集群,并提供更多保护,防止冲突和未经授权的访问。访问变量越困难,程序员使用它的可能性就越小(并提供冲突和未经授权的访问)。
示例:
static class Math_Globals
{
public:
static int math_global; // Declaration.
};
int Math_Globals::math_global; // This is how it would be defined.
带有访问器功能的模块中的静态 C语言中的常见安全措施是在源模块中定义变量static并提供 public 访问器函数。这允许一些访问控制。
实施例: Header.hpp:
int Get_Math_Global(void);
void Set_Math_Global(int new_value);
Source.cpp:
static int my_math_global = INITIAL_VALUE;
int Get_Math_Global(void)
{
return my_math_global;
}
void Set_Math_Global(int new_value)
{
my_math_global = new_value;
return;
}
程序员之间的共识是全局命名空间中定义的变量是邪恶的。有人说任何上述方法(或其他方法)都是优选的。
全局变量可能导致强耦合的函数和难以重用的模块。同样在调试中,找到将变量状态更改为意外值的函数很困难,或者很耗时。
答案 2 :(得分:0)
您在标题上声明了一个名为ggg
的全局变量,包含两个或更多.cpp。
全局变量只应在.cpp上声明,并且可选地在.h。
上定义为外部变量解决方案:
ggg
声明。extern
关键字。ggg
的.cpp上创建一个新的全局变量。