|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
20.07.2009, 20:36 | #1 |
Форумчанин
Регистрация: 16.12.2006
Сообщений: 859
|
заголовочный файл и файл исходного текста
Собственно, какая разница по сути? Есть куча файлов и среди них один единственный .cpp в котором main() и в него инклудятся все остальные. Если все равно все надо инклудить, какая тогда разница .h файл или .cpp или хоть .txt?
Сейчас я делаю так: у меня ОДИН cpp файл и куча .h. У других видел кучу cpp файлов, поэтому и спросил. |
20.07.2009, 22:24 | #2 | |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Цитата:
В заголовочных файлах должен быть только интерфейс (описание классов, функций, глобальных переменных,... исключение: шаблоны), а в cpp - реализация. Так же #include "Source.cpp" писать нихарашо) Главное - качество, а не количество. |
|
20.07.2009, 23:07 | #3 | |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Цитата:
К стати, а это хорошо или не очень, когда что-то инклудишь не в верху, а по мере возникновения необходимости в инклудивании чего-либо? (ну как с объявлением переменных)
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
|
21.07.2009, 00:16 | #4 | |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Цитата:
Лучше вверху, чтобы легче просматривалась зависимость отдельных модулей программы. Появится так по невнимательности циклическая зависимость (а она может быть не прямая: a <-> b, а через пятое колено: a -> b -> c -> a) модулей и ищи свищи потом почему не линкуется программа, а поймешь почему, так ищи этот злочастный инклюд по всему коду... |
|
21.07.2009, 00:35 | #5 | |
Форумчанин
Регистрация: 16.12.2006
Сообщений: 859
|
Цитата:
а даже если и не нужно, то нафиг тогда несвязаные cpp файлы? есть один класс в f1.cpp, второй класс в f2.cpp. как создать их объекты в main.cpp если они не проинклюдены? будет ошибка про необъявленный идентификатор.. вывод - в main.cpp обязательно придется проинклюдить все остальные cppшки... или я не так понял |
|
21.07.2009, 05:52 | #6 | |
Software Engineer
Участник клуба
Регистрация: 07.04.2007
Сообщений: 1,618
|
Цитата:
Но вообще, нужно заметить, что все, что качается модульного программирование - условно. Никто не мешает вам писать все, например, в одном файле, или наоборот - каждую функцию в отдельном. Все это делается для удобства программиста. Вот и делайте как вам удобно
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
|
|
21.07.2009, 08:49 | #7 | |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Цитата:
Там уже видит препроцессор #include "xxx.h" и, грубо говоря, вставляет на это место содержимое соответствующего файла. Именно поэтому *.срр файлы не надо защищать от повторного включения, в отличии от хедеров. С защитой, при попытке повторного включения файла: Код:
А зачем вам связанные срр файлы? Как же повторное использование кода? Скопировал из другого проекта нужный модуль и компилишь себе на здоровье, а если его завязать на main.cpp, то корректировать придется каждый раз. Описываем классы хоть в общем f.h или для каждого свой хедер создаем, а в срр пишем только реализацию методов. В main.cpp соответственно инклюдим этот хедер, а не f1.cpp и f2.cpp. Нам же тут главное, чтобы в main.cpp было известно о существовании класса, а его реализация безразлична. |
|
21.07.2009, 17:11 | #8 | |
Пользователь
Регистрация: 17.07.2009
Сообщений: 91
|
Цитата:
почему ее не нужно ставить,ведб тогда будет сгенерирована ошибка так же интересует как файлы в одном проекте инклудятся друг в друга компилятор видит #include <.....h> и вставляет хедер а сипипишки как? |
|
21.07.2009, 18:56 | #9 | ||
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Цитата:
Цитата:
Компилятор на входе получает кучу сипипишек, берет первую, ищет все нужные хедеры, прописанные в инклюдах, собирает из всего этого некий объектный файл для внутреннего использования и так все сипипишки перебирает. Потом все эти объектные файлы компилятся уже в exe-шник. Отдельно обращаем внимание, что объектные файлы создаются на каждый сипипишник, а не хедер (для хедеров вообще никаких временных файлов не создается и для каждой сипипишки он подключается и обрабатывается заново). т.е. к каждой сипипишке приписывается один и тот же код хедера. Защита от повторного включения защищает только от включения одного и того же кода в объектный файл, т.е. от ситуации: Код:
Код:
Если добавить защиту от копирования, то второй инклюд просто удалится и вместо него никакой код не добавится. Если же в проект добавить еще некий Source.cpp с кодом: Код:
Если мы в a.h добавим строку: "int a;", то прога не скомпилится, потому что в main'е будет создана эта переменная и в Source будет она создана и линкер не поймет какой именно экземпляр и где использовать. Если же этот код и скомпилится, то будет несколько экземпляров одной и той же переменной со всеми вытекающими непонятностями во время работы программы. Потому для глобальных переменных пишем в хедерах "extern int a;", а в сипипишках уже "int a;". Смотрим на этот код: Код:
Последний раз редактировалось pu4koff; 21.07.2009 в 19:31. |
||
21.07.2009, 21:30 | #10 |
Форумчанин
Регистрация: 16.12.2006
Сообщений: 859
|
эксперементальным путем понял что если в хедере
a.h Код:
a.cpp Код:
Код:
верно?? |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ссылка на файл из текущей папки! Сбор инфы в один файл! | mephist | Microsoft Office Excel | 11 | 10.07.2009 13:51 |
Копирование текста в файл | bookkc | Общие вопросы Delphi | 2 | 18.06.2009 23:57 |
Чтение и Запись текста из\в файл(а), C++ | FastDead2 | Помощь студентам | 20 | 14.05.2009 00:01 |
Дан файл, содержащий текст на русском языке.Составить в алфавитном порядке список слов в файл. | JiLiYa | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 26.12.2008 12:05 |
вывод текста в файл | Индийское диско | Общие вопросы Delphi | 6 | 09.10.2007 12:43 |