C++ 声称该对象已定义的链接器
我有一个带有名称空间的头文件,在该名称空间中我声明了几个事件和一个函数。在相应的.cpp文件中,我充实了赋予这些对象属性的函数(对象是并集)。但是,当我编译链接器时,链接器声明对象已经在main.obj中声明,而它们没有声明。我觉得这是我使用名称空间的一个问题,但我找不到任何指向该假设的东西 hC++ 声称该对象已定义的链接器,c++,namespaces,linker-errors,C++,Namespaces,Linker Errors,我有一个带有名称空间的头文件,在该名称空间中我声明了几个事件和一个函数。在相应的.cpp文件中,我充实了赋予这些对象属性的函数(对象是并集)。但是,当我编译链接器时,链接器声明对象已经在main.obj中声明,而它们没有声明。我觉得这是我使用名称空间的一个问题,但我找不到任何指向该假设的东西 h #pragma once #include <SDL.h> namespace UserEvents { /*Events for the StateMachine*/
#pragma once
#include <SDL.h>
namespace UserEvents {
/*Events for the StateMachine*/
SDL_Event switchToEntryState;
SDL_Event switchToIntroState;
SDL_Event switchToGameState;
SDL_Event switchToPauseState;
SDL_Event exitState;
SDL_Event shutdownStateMachine;
bool initUserStates();
};
包含头文件的每个文件都有自己的对象定义。这就是为什么有多种定义
相反,您应该在标题中将对象声明为extern
,然后创建一个包含这些定义的.cpp
文件。extern
说“这只是一个声明。对象将在其他地方定义。”头文件中包含的每个文件都有自己的对象定义。这就是为什么有多种定义
相反,您应该在标题中将对象声明为extern
,然后创建一个包含这些定义的.cpp
文件。extern
说“这只是一个声明。对象将在其他地方定义。”
#include "UserEvents.h"
using namespace UserEvents;
/*
SDL_Event switchToEntryState;
SDL_Event switchToIntroState;
SDL_Event switchToGameState;
SDL_Event switchToPauseState;
SDL_Event exitState;
SDL_Event shutdownStateMachine;
*/
/*
***********************************
USER EVENT CODE CHART
***********************************
EVENT CODE | MODULE
--------------------
0 | STATEMACHINE
*/
bool initUserStates() {
//Attempt to register the number of events
Uint32 userEventType = SDL_RegisterEvents(6); //Registering 6 custom events
if (userEventType!= ((Uint32)-1)) {
//Set up each event
SDL_zero(switchToEntryState);
SDL_zero(switchToIntroState);
SDL_zero(switchToGameState);
SDL_zero(switchToPauseState);
SDL_zero(exitState);
SDL_zero(shutdownStateMachine);
switchToEntryState.type = userEventType;
switchToIntroState.type = userEventType;
switchToGameState.type = userEventType;
switchToPauseState.type = userEventType;
exitState.type = userEventType;
shutdownStateMachine.type = userEventType;
switchToEntryState.user.code = 0;
switchToIntroState.user.code = 0;
switchToGameState.user.code = 0;
switchToPauseState.user.code = 0;
exitState.user.code = 0;
shutdownStateMachine.user.code = 0;
switchToEntryState.user.data1 = (void*)0;
switchToIntroState.user.data1 = (void*)1;
switchToGameState.user.data1 = (void*)2;
switchToPauseState.user.data1 = (void*)3;
exitState.user.data1 = (void*)4;
shutdownStateMachine.user.data1 = (void*)-1;
return 1;
}
return 0;
}