0

我现在用谷歌搜索了大约 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
}
4

3 回答 3

10

您可能需要extern在头文件中声明您的全局:

extern Game *game;

然后在 .cpp 文件中定义它。

于 2011-02-08T17:33:56.260 回答
3

以下是一些处理全局变量的方法:

  • 在单独的命名空间中定义
  • 集群成一个静态类
  • 具有访问器函数的静态源
  • 在全局命名空间中定义

在任何情况下,首选方法是在头文件中声明变量并在源文件中定义它。

单独的命名空间

这比在全局命名空间中声明的变量要好,因为它减少了与其他变量冲突的可能性并减少了其他函数的污染。

例子:

namespace Math_Globals
{
  int a_math_int;
}

聚集在静态类中

其他语言不允许全局变量,因此必须将它们聚集到一个类中。使它们在类中成为静态的,而静态类仅提供一个实例。类似于单例模式。

这种设计允许您对全局变量进行集群,并提供更多的保护,防止碰撞和未经授权的访问。访问变量越难,程序员就越不可能使用它(并提供冲突和未经授权的访问)。

例子:

static class Math_Globals
{
  public:
    static int math_global;  // Declaration.
};

int Math_Globals::math_global;  // This is how it would be defined.

带有访问器函数的模块中的静态 C 语言中的一个常见保护措施是在源模块中定义变量 static 并提供公共访问器函数。这允许一些访问控制。

示例: Header.hpp:

int Get_Math_Global(void);
void Set_Math_Global(int new_value);

源.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;
}

全局命名空间

程序员之间的共识是,在全局命名空间中定义的变量是邪恶的。有人说上述任何一种方法(或其他方法)都是首选。

全局变量可能导致难以重用的强耦合功能和模块。同样在调试中,找到将变量状态更改为意外值的函数很困难,或者很耗时。

于 2011-02-08T18:08:59.863 回答
0

您正在声明一个ggg在标题上命名的全局变量,包含在两个或多个 .cpp 中。

全局变量只能在 .cpp 上声明,并且可以选择在 .h 上定义为外部变量。

解决方案:

  1. 找到ggg声明。
  2. 在它之前添加extern关键字。
  3. 在名为 .cpp 的 .cpp 上创建一个新的全局变量ggg
于 2011-02-08T17:34:23.307 回答