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

标签 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
    //...
}

一些类.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 错误。问题是什么?从设计的角度来看,这甚至是个好主意,还是我应该尝试使用具有静态成员和方法的类?

最佳答案

问题是您只声明但没有定义变量。

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

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

关于C++ extern 关键字和全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11122958/

相关文章:

c++ - 链接器错误 : undefined reference to `vtable of QGLViewer’

c++ - 在 Eclipse CDT 中使用与另一个项目相同的设置创建一个新的 C++ 项目

r - 在 R 中的并行应用中设置矩阵行中的值

c++ - 多态分配器 : how to change the memory resource of a container

c++ - 定义静态成员的默认参数

ruby - 将 Ruby gem 加载到用户定义的命名空间中

c++ - 在匿名命名空间中使用命名空间安全吗?

Php Carbon 使用 Carbon\Carbon

c++ - 我应该在启动时或第一次使用它们时设置全局变量值吗? C++

c# - 托管线程会影响 C dll 中的全局变量吗?