如何使名称空间的内容对整个项目可用而不产生“多重定义符号”错误

How can contents of a namespace be made available to an entire project without generating Multiply Defined Symbol errors?

本文关键字:定义 错误 符号 定义符 空间 何使名 项目      更新时间:2023-10-16

我正在尝试制作一个相当大的电子游戏,我目前处理鼠标输入的方法是将mouseX, mouseY和enum mouseState作为参数传递给每个需要鼠标知识的单个对象的更新函数。这是相当混乱的,我想通过将鼠标变量放在一个名为Input的名称空间中来使它们更加全局化,以便我可以使用Input::mouseX等来访问它们。

现在,名称空间Input存在于Input.h(下面的内容)

#pragma once
#include "allegro5allegro.h"
#include "J_Enum.h"
namespace Input{
ALLEGRO_EVENT_QUEUE *inputQueue;
int mouseX;
int mouseY;
MOUSE_STATE mouseState;
void setUpInput();
void updateInput();
};

和两个成员函数在Input.cpp

中定义
#include "Input.h"
void Input::setUpInput(){...declaration
void Input::updateInput(){...''

在主循环对象的头文件Core.h中包含Input.h后,链接器会抛出一个错误,因为在它看来,Input.h中包含的所有内容现在都是一个Multiply Defined Symbol。显然,我对头文件的使用有问题,因为据我所知,我在使用名称空间方面没有犯任何明显的错误,而且LNK2005的错误代码前缀似乎暗示了链接器(?)。

如果有人能对我的困境提出一些建议,我将不胜感激

声明变量为extern:

// header file:
namespace Input {
  extern int mouseX;
}
// implementation
#include "input.h"
namespace Input {
  int mouseX;
}