2011-12-29 3 views
0

У меня есть один файл example1.cpp с функцией main. Этот файл должен содержать #include mylib.h и #include lib.h. Файл mylib.h также имеет #include lib.h. Когда я пытаюсь скомпилировать эту программу, ошибка redefinition xyz function ocurs.Переопределение функции

example1.cpp

#include mylib.h 
#include lib.h 

int main(){ 
//code 
} 

mylib.h

#include lib.h 

//rest code 
+3

Показать код в заголовочных файлах, пожалуйста, и также использовать копировать/вставить, чтобы показать фактическое сообщение об ошибке –

+3

вы используете включают охрану? –

+0

@ userr902691 Если одна из этих проблем решена, пожалуйста, не забудьте [принять] (http://stackoverflow.com/faq#howtoask) ответ, который наилучшим образом решает вашу проблему. –

ответ

4

Вы должны обернуть .h файлы в #defines, чтобы избежать redifinitions. Например:

#if !defined(_MY_LIB_H_) 
#define _MY_LIB_H_ 

// Add your function definitions here... 

#endif // _MY_LIB_H_ 

Теперь вы можете включить его в любом месте, и определение функции будет прочитано один раз. Также обратите внимание, что вы можете использовать #ifndef в зависимости от компилятора. VC++, например, позволяет «#pragma один раз», если это версия 10 или выше:

#if _MSC_VER > 1000 
#pragma once 
#endif 

В этом случае вам не нужно использовать пояснялось выше в #defines.

+4

Вы должны удалить ведущее подчеркивание с '_MY_LIB_H_'. В стандарте C++ 98, 17.4.3.1.2 говорится: «Каждое имя, содержащее двойной знак подчеркивания или начинающийся с символа подчеркивания, за которым следует верхний регистр , зарезервировано для реализации для любого использования». –

+1

Аналогичным образом существует также предложение в стандартах C99 и C11 (вопрос отмечен как C, так и C++). – dreamlax

7

В файле заголовка вам нужно поставить include guards, чтобы он не включался несколько раз во время компиляции.

#ifndef LIB_H 
#define LIB_H 

// Actual header file code 

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