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