Линкер утверждает, что объект уже определен

0

У меня есть файл заголовка с пространством имен, и внутри этого пространства имен у меня есть несколько объявленных событий и одна функция. Внутри соответствующего файла.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;
}
Теги:
namespaces
linker-errors

1 ответ

4
Лучший ответ

Каждый файл, который #include заголовочный файл, будет иметь собственное определение объектов. Вот почему есть несколько определений.

Вместо этого вы должны объявлять объекты как extern в заголовке, а затем иметь один .cpp файл, содержащий эти определения. extern говорит: "Это просто объявление. Объект будет определен в другом месте".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню