У меня есть файл заголовка с пространством имен, и внутри этого пространства имен у меня есть несколько объявленных событий и одна функция. Внутри соответствующего файла.cpp я использую функцию, которая даст этим объектам их свойства (объекты являются объединениями). Однако, когда я компилирую компоновщик, утверждают, что объекты уже были объявлены в main.obj, когда они этого не сделали. Я чувствую, что это проблема со мной, используя пространство имен, но я не могу найти ничего, указывающего на это предположение.
.H
#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();
};
И.cpp
#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;
}
Каждый файл, который #include
заголовочный файл, будет иметь собственное определение объектов. Вот почему есть несколько определений.
Вместо этого вы должны объявлять объекты как extern
в заголовке, а затем иметь один .cpp
файл, содержащий эти определения. extern
говорит: "Это просто объявление. Объект будет определен в другом месте".