2012-06-25 2 views
1

Я использую код here, и я хочу, чтобы все функции, вызывающие функции SDL, были в другом файле заголовка вместо основного .cpp-файла. Поэтому я создал новый файл под названием Methods.h. Вот что файлы выглядеть следующим образом:Почему Code :: Blocks показывает множественное определение ошибки?

main.cpp: 

#include "Methods.h" 
... 

Methods.h: 

#include "SDL/SDL.h" 
#include "SDL/SDL_opengl.h" 
.... 

И я удалил все функции из основных и поместить их в Methods.h

Когда я пытаюсь построить проект, он говорит: «Ошибка множественного определения» ,

/media/Data1/Projects/OpenGL/Game2/Methods.h|29|multiple definition of `event'| 
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|29|first defined here| 
obj/Debug/src/Machine.o||In function `drawFrame()':| 
/media/Data1/Projects/OpenGL/Game2/Methods.h|29|multiple definition of `drawFrame()'| 
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|29|first defined here| 
obj/Debug/src/Machine.o||In function `init_GL()':| 
/media/Data1/Projects/OpenGL/Game2/Methods.h|73|multiple definition of `init_GL()'| 
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|73|first defined here| 
obj/Debug/src/Machine.o||In function `init()':| 
/media/Data1/Projects/OpenGL/Game2/Methods.h|97|multiple definition of `init()'| 
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|97|first defined here| 
obj/Debug/src/Machine.o||In function `clean_up()':| 
/media/Data1/Projects/OpenGL/Game2/Methods.h|123|multiple definition of `clean_up()'| 
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|123|first defined here| 
+1

Где включают охрану? '#ifndef METHODS_H_ #define METHODS_H_ ... # endif' – maverik

+0

Спасибо. Я их положил. Однако это не решило. Есть ли необходимость в моем случае? – batman

+0

Это не решает проблему, но настоятельно рекомендуется использовать включенные охранники в файлах include. – maverik

ответ

3

Похоже, у вас есть несколько определений функций в файле заголовка, это означает, что вы получите отдельное определение каждой функции из каждого исходного файла, который включает в себя заголовок. Они должны быть объявлены inline для того, чтобы они могли быть определены в каждой единице перевода, которая включает в себя заголовок:

// Methods.h 
#ifndef METHODS_H 
#define METHODS_H 

inline void initGL() { 
    // do stuff 
} 

#endif 

В качестве альтернативы, вы можете просто объявить их в заголовке, и перемещать определения в исходном файле:

// Methods.h 
#ifndef METHODS_H 
#define METHODS_H 

void initGL(); 

#endif 

// Methods.cpp 
#include "Methods.h" 

void initGL() { 
    // do stuff 
} 

Существует также глобальная переменная. Если вы хотите сохранить это, вам придется переместить определение в исходный файл и объявить его extern в файле заголовка. В качестве альтернативы, вы можете заменить его с функцией, которая обращается к статической переменной:

inline SDL_Event & event() { 
    static SDL_Event instance; 
    return instance; 
} 

Это имеет преимущество, и недостаток, что он инициализируется в первый раз, когда вызывается функция.

+0

THANK В файле Methods.h есть событие «SDL_Event»; Я предполагаю, что это глобальная переменная. Теперь я не могу поставить «inline» на это, не так ли? – batman

+0

@learner: Нет, вы не можете «встроить» это. Я обновил свой ответ с помощью опций. –

+0

Хорошо, но почему это дает множественную ошибку определения? Где множественное определение? – batman

1

Когда вы добавляете файл в кодовые блоки с файлом file-new-file-source и т. Д., Есть экран, в котором спрашивается, хотите ли вы включить файл в отладочные и выпускные версии. Если вы отметите поля, которые думают, что, конечно, я хочу включить их, почему еще я бы добавил файл? то кодовые блоки автоматически включают ваш файл. Когда вы затем включаете файл в свой код, вы дублируете то, что он автоматически делает. Таким образом, при добавлении файла не отмечайте эти поля, потому что результат очень запутан. Это было сегодня.

веселит

Толстяк

Смежные вопросы