C ++定义全局变量的位置(链接器错误:符号已定义)

时间:2011-02-08 17:27:34

标签: c++ linker symbols globals

我现在用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
}

3 个答案:

答案 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。

上定义为外部变量

解决方案:

  1. 找到ggg声明。
  2. 在其前添加extern关键字。
  3. 在名为ggg的.cpp上创建一个新的全局变量。