如何声明一个可以通过多个头文件访问的对象?

时间:2019-01-22 22:38:41

标签: c++ header

我正在一个项目上,正在清理代码并重新做代码,以使代码更具可读性和易调整性。我遇到一个问题,但是当我在头文件中创建对象时,编译器向我抛出一个错误,指出已定义该错误;假定为int。 LNK-2005。

我尝试将对象创建为'extern',以便可以从包含指定对象的文件的所有文件中访问对象。

// HeaderA.h
#include <Windows.h>

    struct ProcessInfo
    {
         int ProcID;

         HANDLE Handle;

    };

这是下面的标题B

// Header B starts here
// HeaderB.h
#include "HeaderA.h"
{
    ProcessInfo pi;
    pi.ProcID = 10;


    struct Player
    {
        int health = 0;

        float x, y, z;

        int score = 0;
    }
}

标题C 该文件应该能够使用标题B的对象'pi'

//HeaderC.h
#include "HeaderB.h"

// creating object from headerB 
Player player;

// is there a way so I can use the object declared in HeaderB in HeaderC?
// like so
pi.ProcID = 45;

我希望能够通过HeaderB-HeaderZ之类的多个文件使用在标头B中创建的对象。 (A-Z;多个标题)但是在编译时出现错误“ LNK2005已经定义”。

1 个答案:

答案 0 :(得分:0)

您可以使用保护宏来避免多个定义,但这仅在只有一个翻译单元的情况下有效:

标题A:

#ifndef HEADERA_H
#define HEADERA_H
// HeaderA.h
#include <Windows.h>

    struct ProcessInfo
    {
         int ProcID;

         HANDLE Handle;

    };
#endif // HEADERA_H

标题B:

#ifndef HEADERB_H
#define HEADERB_H

// Header B starts here
// HeaderB.h
#include "HeaderA.h"
{
    ProcessInfo pi;
    pi.ProcID = 10;


    struct Player
    {
        int health = 0;

        float x, y, z;

        int score = 0;
    };
}
#endif // HEADERB_H

headerC相同

在现代编译器中,您还可以在每个标头的beginnig中添加指令“ #pragma一次”。

但是,如果您需要在不同的cpp文件(翻译单元)中使用一个全局变量,则希望每个翻译单元都具有自己的变量实例,则可以使用“静态”关键字。

static ProcessInfo pi;

或者要在翻译单元之间共享值,可以在标头中使用extern关键字,并在一个cpp文件中定义变量。

#ifndef HEADERB_H
#define HEADERB_H

#include "HeaderA.h"
extern ProcessInfo pi;

#endif // HEADERB_H

unitB.cpp

#include "HeaderB.h"
ProcessInfo pi;
pi.ProcID = 10;