Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何声明可以通过多个头文件访问的对象?_C++_Header - Fatal编程技术网

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

C++ 如何声明可以通过多个头文件访问的对象?,c++,header,C++,Header,我正在做一个项目,我正在清理我的代码并重新编写代码,这样它更可读,更容易调整。我有一个问题,当我在头文件中创建一个对象时,编译器抛出一个错误,说它已经定义了;假定为int。LNK-2005 我尝试将对象创建为“extern”,以便可以从包含指定对象的文件的所有文件中访问对象 // HeaderA.h #include <Windows.h> struct ProcessInfo { int ProcID; HANDLE Hand

我正在做一个项目,我正在清理我的代码并重新编写代码,这样它更可读,更容易调整。我有一个问题,当我在头文件中创建一个对象时,编译器抛出一个错误,说它已经定义了;假定为int。LNK-2005

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

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

    struct ProcessInfo
    {
         int ProcID;

         HANDLE Handle;

    };
标题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。

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

标题A:

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

    struct ProcessInfo
    {
         int ProcID;

         HANDLE Handle;

    };
#endif // HEADERA_H
校长也一样

在现代编译器中,还可以在每个头的开头添加一次指令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;

所以基本上把对象声明放在一个单独的全局头文件中?每个需要对象的头文件都只包含头文件,它位于?是的,例如,加上一个源文件,对象实际上是在其中定义的,而不仅仅是声明的。
#ifndef HEADERB_H
#define HEADERB_H

#include "HeaderA.h"
extern ProcessInfo pi;

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