![]() |
|
Модераторы: bsa |
![]()
|
|
| KuMa1104 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: 1 Всего: 3 |
Здравсвуйте, кинте пожалуста ссылочку на статью в которои доходчиво описывается разделение кода на .h/.cpp
Зачем нужно, что даёт какие нюансы и когда нужно использовать. -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
KuMa1104, ищите статьи на тему "раздельная компиляция", "линковка".
Надо уделить особое внимание различиям между объявлением и определением (переменных, функций, классов и т.д. и т.п). Особенно важно знать что inline функции имеют внешнюю линковку external linkage но не подчинаются ODR (one definition rule - правило одного определения). Для классов что такое complete type и что такое forward declaration. А когда дело касается шаблонов... В общем, тема весьма обширна. Лично я не читал статьи, которая всё это покрывает полностью, но попадались и достаточно детальные. Ссылок не храню, есть Google. P.S. Все данные-члены классов, даже static, имеют внешнюю линковку. Это сообщение отредактировал(а) Леопольд - 7.9.2010, 07:54 -------------------- вопросов больше чем ответов |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
KuMa1104, в принципе, все просто - в хидерах должны быть объявления, в cpp определения (реализация). А дальше начинается куча нюансов, на которую пытался заострить внимание Леопольд. Тебе для начала нужно всего лишь выяснить чем объявление отличается от определения, начать делить на h и cpp, а потом с опытом понимание того, что именно надо выносить в h, когда и в какой именно, придет само собой.
|
|||
|
||||
| icecrashldr |
|
|||
![]() Developer ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 5.7.2010 Репутация: нет Всего: нет |
bsa, Не совсем, в не которых случаях, .c/.cpp файлы могут выступать в роли заголовком, создовая полиморфное три(и большое количество файлов).
.h/.hpp содержат объявления чего либо - Глобальная переменная (переменные) - Функция(Функции) - Классы - Структуры - Новые типы данных - препроцессорные переменные, макросы - Плюс конечно же шаблоны, который должны быть реализованы в этом же файле. .c/.cpp Содержат реализацию, либо можно сказать программный код, данные - Глобальная переменная - Реализация функций(но не шаблонных, хотя при желании) - Реализация Классов. - Реализация Структур. Вывод таков. .c/.cpp содержат программный код(данные, переменные) которые линковщик будет линковать для получения исполняемого файла(exe, dll, sys ... ) .h/.hpp содержат только объявления, и линковщик грубо говоря об них не знает, так что программный код(данные), не могут попасть в исполняемый файл(exe, dll, sys ... ). Шаблонный генерируется во время компиляции и за это отвечает компилятор, так что как он его слинкует это его задача. Но в целом все придет с опытом. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| jonie |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
да ну?
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
а ничего, что сам заголовочный файл попадает в c/cpp при include-е еще во время работы препроцессора? файл в любым расширением может выступать в роли заголовочного, но дело не в расширении файла а в его содержании. Это сообщение отредактировал(а) azesmcar - 8.9.2010, 08:12 |
|||
|
||||
| icecrashldr |
|
||||
![]() Developer ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 5.7.2010 Репутация: нет Всего: нет |
1)
mes, Как? 2) jonie, А теперь сделай использования переменной из двух .c/.cpp файлов ... 3) azesmcar,
Согласен. Но бывают случаи когда .c/.cpp с реализацией выступает в роли заголовочных. Файл реализации как заголовочный? Как то запутано ... Это метод с основном применяется на "С" как альтернатива , шаблонам. |
||||
|
|||||
| azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
это показывает фундаментальное непонимание работы макроса include. #include на самом деле не делает ничего сверхъестественного, он берет содержание включаемого файла и вставляет его вместо директивы include. Все просто до безобразия
Добавлено через 1 минуту и 43 секунды
Что значит "бывают случаи"? Может лучше так - "есть код, в котором..." и так далее, но это не значит что так правильно. |
||||||
|
|||||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Я окончательно понял смысл разделения h/cpp только после того, как вкурил, как работает компилятор и линковщик. Имеется в виду не теория компиляторов, а последовательность и смысл действий компилятора и линковщика во время сборки программы.
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Значит ТС рекомендуется почитать Этапы сборки программы |
|||
|
||||
| icecrashldr |
|
||||||
![]() Developer ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 5.7.2010 Репутация: нет Всего: нет |
azesmcar, Пальцем в небо ...
Понятное дело что не заголовочный файл делает связь между .cpp и другой реализацией. Читаем внимательно
Я же не говорил что он связующий. Да, информация из заголовочного файла будет добавлена в .cpp, иначе зачем вообще они нужны? И конечно же да, если есть программный код (или данные) то компилятор добавлять в .cpp, что говорит от том, что в дизайне файлов Заголовочный файл должен выступает как связующий.
Правильно? А где говорится что это не правильно? Бывают случаи когда так сделать рациональней. например реализация 32,64 - bits, Вперед генерировать кучу кода, когда как раз он красиво разруливается "реализацией выступает в роли заголовочных." |
||||||
|
|||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
|
|||
|
||||
| KuMa1104 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: 1 Всего: 3 |
Хм. дауж много опасных нюансов.
Похоже что разделение кода на .h/.cpp часто представляет для программиста с++ место потенциальных ошибок. Как я понимаю за удобство разделения внешнего интерфейса от реализации приходится платить немалую цену. Буду иметь в виду, спасибо всем за ваши ответы. Это сообщение отредактировал(а) KuMa1104 - 8.9.2010, 23:13 -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
|
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Опасных тут нет. Нюансов много, но если все объявления пихать в хидер, а всю реализацию в cpp, то проблем у тебя никаких не будет. Нюансы начинаются с того момента, когда ты захочешь не все объявления пихать в хидер. Но к тому моменту, скорее всего, ты уже будешь о них знать по собственному опыту. |
|||
|
||||
| rudvil |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 1 Всего: 3 |
Тоже стало интерестно, а именно: я что-нибудь выйграю если разобью большой класс(без шаблонов, также он не будет использоваться как библиотека) на h/cpp.
--------------------
xor |
|||
|
||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
rudvil, куда больше Вы выиграете от того, что узнаете, что в 21 веке ручное разделения класса/модуля на интерфейс и реализацию не считается приличным.
С++ is so 90s! -------------------- |
|||
|
||||
| rudvil |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 1 Всего: 3 |
Вот оно что, а я то думал что boost все в *.hpp держит только из-за использования шаблонов. Спасибо что просветили --------------------
xor |
|||
|
||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
rudvil, боюсь Вы не поняли... Или может я уже чего-то не понимаю...
-------------------- |
|||
|
||||
| rudvil |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 1 Всего: 3 |
Да, я не совсем то написал, хотел сказать - что реализация как в яве
опять же если я правильно вас понял. Это сообщение отредактировал(а) rudvil - 12.9.2010, 21:42 --------------------
xor |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
rudvil, кстати, шаблонные классы разделять на обявление и реализацию не стоит - реализация шаблона должна быть доступна во всех единицах трансляции, где он используется.
|
|||
|
||||
| Muerto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1207 Регистрация: 23.9.2006 Репутация: нет Всего: 4 |
Простите за тупой вопрос... но собственно в чем вообще преимущество интерфейсов?
Читаю сейчас книгу освой с++ за 21 день, так так советуют интерфейс пихнуть в .hpp а реализацию оставить... Моя здравая логика говорит что - правильней наоборот... Когда человек открывает прогу и у него есть интерфейс struct класса, так ему понятно что функции делают... Это куда лучше чем смотреть 1000 строк кода реализации... |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
ты сам ответил
это, правда, не основное и не единственное преимущество. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| baldina |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
напрямую связано с понятием "раздельная компиляция", т.е. каждый cpp компилируется отдельно, и о содержимом других файлов проекта компилятор не подозревает (в других языках могут использоваться иные модели и правила, например сборки С#). для того, что бы использовать пользовательские типы и переменные, определенные где-то (возможно, в другом cpp), их надо предварительно объявить. что бы не делать это многократно, такие объявления помещают в отдельный файл (обычно с расширением .h) и включают его при помощи директивы include. это основное. дальше - детали, касаемые внешних и статических переменных и констант, inline функций (в т.ч. шаблонных) и прочая...
в любой книжке по С++ про это довольно доходчиво написано - Прата, Страуструп и иные... например тут Добавлено через 11 минут и 23 секунды объявление (declaration), требуемое перед использованием суть интерфейс (типа, переменной, функции, шаблона). определение (definition) - реализация. таким образом помещая объявления в заголовок мы разделяем интерфейс и реализацию. это другая сторона вопроса, чуть иной подход. таким образом механизмы и правила (хорошего тона) языка способствуют правильному подходу к программированию.
в том, что на телевизоре 4 кнопки (это интерфейс) и для его управления достаточно знать, что они делают, а не разбираться в электронной схеме (реализация) |
||||||
|
|||||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
при этом слова "где он используется" может означать не совсем ожидаемые вещи тут Это сообщение отредактировал(а) baldina - 13.9.2010, 15:31 |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |