2015-05-19 3 views
-3

https://gist.github.com/protectivetoast83/25301772cbc6f13e6e07Таинственная ошибка "множественное определение"

я переехал

#include "time.h" 

из линии 2 objColPhys.cpp (который унаследовал от objects.h) в строку 3 объектов. h

время.h не включен нигде в проект, но Сейчас я получаю сообщение об ошибке множественного определения на линии 9 из time.h

In function `Z7runTimev': 
multiple definition of `runTime()' 
first defined here 

также, я не знаю, что Z7runTimev вещь о, так как функция объявлена ​​как RUNTIME()

Что происходит и как я могу это исправить?

+0

http://en.wikipedia.org/wiki/Include_guard и http://en.wikipedia.org/wiki/Name_mangling –

ответ

0

Вы пропустили все включенные охранники в ваших включенных файлах (как указано в комментариях, я буду раскрывать его здесь для ясности).

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

Эту проблему можно решить, просто добавив следующий код для включаемых файлов:

#ifndef _TIME_H 
#define _TIME_H 

// Header file code here 

#endif 

Это гарантирует, что файл включается только один раз (остальная часть времени препроцессор пропускает код заголовка файла из-за директива #ifndef). Вам нужно добавить защитные ограждения для всех ваших включенных файлов для обеспечения безопасности, с соответствующим названием, конечно.

Многие компиляторы в настоящее время поддерживает директиву #pragma once который нужно добавить в начало файла, и позволяет избежать хлопот того, уродливые #ifdef сек в начале файла (и, конечно же, что одинокая #endif в конце)

+0

Спасибо большое! Я добавлю их в свои файлы. Я просто немного смущен тем, почему я получаю эту ошибку в первую очередь, поскольку файл _time.h_ включен только один раз. ** РЕДАКТИРОВАТЬ: ** Я попробовал оба включить охрану вовремя.h, и я все равно получаю ту же самую ошибку в той же строке. – cafemolecular

+0

Вам нужно добавить его в каждый заголовочный файл, также в objects.h: '#ifndef _OBJECTS_H' –

+0

Я добавил защитников заголовков в каждый заголовок проекта, и я все еще получаю несколько ошибок определения для всего, что было объявлено во времени.h (и только во времени.h). Я попытался изменить имена элементов в этом файле на всякий случай, но у меня все еще есть несколько ошибок определения для всех из них. – cafemolecular

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