C / C ++全局变量唯一性?

时间:2017-07-14 14:31:46

标签: c++ c pointers global-variables

请考虑以下事项:

// defs.h
extern "C" {

    typedef struct t_state
    {
        bool b;
    } t_state;

    static t_state _state;

    void t_state_allocate();
}

// defs.cpp

#include "defs.h"
void t_state_allocate()
{
    _state.b = true;
    printf("G state at %p is %d\n", &_state, _state.b);
}

// App.hpp

#include "defs.h"
class App
{
    App();
};

// App.cpp

#include "App.hpp"
App::App()
{
    printf("1 state at %p is %d\n", &_state, _state.b)
    t_state_allocate();
    printf("2 state at %p is %d\n", &_state, _state.b)
}

G ++下的输出类似于:

  

0x736e20处的1状态为0

     

0x9cb140处的G状态为1

     

0x736e20处的2状态为0

这里预期的行为是访问相同的结构..哪里出错?

编辑1

t_state必须是纯C struct,因为它用于其他.c源代码(以及extern关键字)。但是,我可以授予 nobody 修改其内容。

2 个答案:

答案 0 :(得分:1)

在你的代码中,你有两个不同的全局变量:一个在App.cpp,包括defs.h,另一个在defs.cpp,包括defs.h.

您必须使用extern,如下所示:

How do I use extern to share variables between source files?

答案 1 :(得分:1)

defs.h在两个不同的.cpp文件中包含两次。所以有两个_state创建的实例。这是因为#include实际上将标头的内容粘贴到包含它的文件中。那么你如何解决这个问题呢?使用extern

typedef struct t_state
{
   bool b;
} t_state;

extern t_state _state; //Tells the compiler to share the variable between files.

现在您可以在每个源文件中使用该变量:

#include "defs.h"
void t_state_allocate()
{
   _state.b = true;
   printf("G state at %p is %d\n", &_state, _state.b);
}