C ++ extern关键字和全局变量

时间:2012-06-20 15:30:03

标签: c++ namespaces global-variables extern

我有两个名为file_utils.h和file_utils.cpp的文件,其中包含一些由不同类使用的方法和变量。以下是它的外观示例:

file_utils.h:

namespace my_namespace
{
extern Foo* foo;
extern Bar* bar;

void my_function(Blah* blah);
}

file_utils.cpp

#include "file_utils.h"

void my_namespace::my_function(Blah* blah)
{
    foo = 0;    // undefined reference to my_namespace::foo
    bar = 0;    // undefined reference to my_namespace::bar
    //...
}

some_class.cpp

#include "file_utils.h"

some_function()
{
    my_namespace::my_function(blah);
    this->foo = *my_namespace::foo; // will that work ok?
}

所以错误在评论中。如果我删除了extern关键字,我会收到multiple definition of my_namespace::foo错误。问题是什么?从设计的角度来看,这是一个好主意,还是我应该尝试使用静态成员和方法的类?

2 个答案:

答案 0 :(得分:7)

问题是你只是声明而不是定义了变量。

您需要在单个实现文件中提供定义:

<强> file_utils.cpp

#include "file_utils.h"

//definition:
namespace my_namespace
{
   Foo* foo;
   Bar* bar;
}

//alternatively, to keep the same formatting you have
//Foo* my_namespace::foo;
//Bar* my_namespace::bar;

void my_namespace::my_function(Blah* blah)
{
    foo = 0;
    bar = 0;
    //...
}

答案 1 :(得分:0)

首先,我会真的建议您澄清两个不同之处:

  • 声明与定义
  • 编译器与链接器

在您的情况下,您会收到链接器错误。未定义的引用意味着您的代码指向某处,但链接器无法找出位置。

当您使用代码中某处找到的对象时,extern关键字用于抑制编译器错误。在您的示例中,链接器尝试查找类的实例但失败。这不常用于指针(如果我错了,请纠正我)。 因此:

<强> utils.h

namespace mySpace{
    extern Foo foo; // notes that foo of type Foo will be used.

    void myFn();
}

<强> utils.cpp

#include "utils.h"

void mySpace::myFn(){
    foo.bar = 5; // changes a member of foo from globals.cpp
}

<强> globals.cpp

Foo mySpace::foo; // this is the actual foo used.

如果您想解答有关some_class.cpp的问题,请向社区提供有关conversions以及您希望实现的内容的知识。

从语义来判断我认为它是对班级成员conversions的引用。