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

How do you declare a object that can be accessed through multiple header files?

本文关键字:文件 访问 对象 可通过 何声明 声明      更新时间:2023-10-16

我正在做一个项目,我正在清理我的代码并重新做代码,以便它更具可读性和易于调整。我遇到了一个问题,但是当我在头文件中创建一个对象时,编译器会向我抛出一个错误,说它已经定义;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已经定义"。

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

标题 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

标头 C 也是如此

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

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

static ProcessInfo pi;

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

#ifndef HEADERB_H
#define HEADERB_H
#include "HeaderA.h"
extern ProcessInfo pi;
#endif // HEADERB_H

单位B.cpp

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