2011-11-30 2 views
2

Получение LNK2005 «уже определен в GUI.obj» для указателя функции в PAL.hне #ifndef работает, как ожидалось

//GUI.cpp 
#include "PAL.h" 

//PAL.h 
#define PAL_INCLUDE 
int (*addPAL)(int, void(*)(), void(*)()); 

//main.cpp 
#include "GUI.h" 
#ifndef PAL_INCLUDE 
#include "PAL.h" 
#endif 

не поняли, я природу включает в себя и #ifndef?

+0

где используется addPAL? Я предполагаю, что вы делаете его глобальным, чтобы передать функцию между двумя файлами .cpp. –

ответ

5

Вы получаете ошибку, вероятно, потому, что препроцессор обрабатывает main.cpp перед GUI.cpp. Попробуйте изменить содержание вашего PAL.h к этому:

#ifndef PAL_INCLUDED 
#define PAL_INCLUDED 
// definitions 
#endif 

Ссылка

Include guard

3

Я думаю, вы должны использовать include guard над PAL.h.

Если я понимаю, что вы пытаетесь сделать, это код гораздо более ясно (и довольно часто там):

GUI.h

#ifndef _GUI_H_ 
#define _GUI_H_ 
... 
#endif 

GUI.cpp

#include "PAL.h" 
... 

PAL.h

#ifndef _PAL_H_ 
#define _PAL_H_ 

int (*addPAL)(int, void(*)(), void(*)()); 

#endif 

main.cpp

#include "GUI.h" 
#include "PAL.h" 
... 

Надеюсь, это поможет.

+0

Включить защитные устройства - хорошая идея, но он получает ошибку ссылки для определения addPAL дважды. –

+0

И он делает, потому что его компилятор, вероятно, компилирует все источников до 'main.cpp', и у него есть несколько файлов 'cpp', включая' PAL.h'. Таким образом, каждый раз, когда он включает 'PAL.h', он переопределяет' addPAL', поэтому я думаю, что мы говорим об одном и том же. – frarees

+0

Два файла GUI.cpp и main.cpp скомпилированы отдельно (порядок не имеет значения), а затем во время соединения компилятор находит два определения addPAL, потому что PAL.h включен в каждый. Включите защитные устройства, чтобы предотвратить включение .h из нескольких файлов в один .cpp-файл. –

2

addPal становится определено дважды, один раз в GUI.cpp и один раз в main.cpp. Вы хотите определить его один раз и объявить его везде, где вам нужно его использовать. Я предлагаю положить

int (*addPAL)(int, void(*)(), void(*)()); 

в одном из файлов .cpp (я не видел достаточно кода, чтобы решить, какой из них она принадлежит), то объявление:

extern int (*addPAL)(int, void(*)(), void(*)()); 

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

1

Main.cpp и GUI.cpp скомпилированы отдельно друг от друга, а затем связаны друг с другом. Это означает, что состояние препроцессора сбрасывается между двумя компиляторами, и вы теряете определение PAL_INCLUDE
Защитники заголовка останавливают заголовок от включения одного и того же заголовка в одном компиляторе, а не для предотвращения столкновений в компоновщике.

Попробуйте положить static перед объявлением метода - он ограничивает функцию текущего устройства, тем самым предотвращая эту проблему. Для получения дополнительной информации см. What is a “static” function?

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