Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разделение кода на .h/.cpp 
:(
    Опции темы
KuMa1104
Дата 6.9.2010, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



Здравсвуйте, кинте пожалуста ссылочку на статью в которои доходчиво описывается разделение кода на .h/.cpp

Зачем нужно, что даёт какие нюансы и когда нужно использовать.


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Леопольд
Дата 7.9.2010, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
bsa
Дата 7.9.2010, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



KuMa1104, в принципе, все просто - в хидерах должны быть объявления, в cpp определения (реализация). А дальше начинается куча нюансов, на которую пытался заострить внимание Леопольд. Тебе для начала нужно всего лишь выяснить чем объявление отличается от определения, начать делить на h и cpp, а потом с опытом понимание того, что именно надо выносить в h, когда и в какой именно, придет само собой.
PM   Вверх
icecrashldr
Дата 7.9.2010, 19:43 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



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

.h/.hpp содержат объявления чего либо
 - Глобальная переменная (переменные)
 - Функция(Функции)
 - Классы
 - Структуры
 - Новые типы данных
 - препроцессорные переменные, макросы
 - Плюс конечно же шаблоны, который должны быть реализованы в этом же файле.

.c/.cpp Содержат реализацию, либо можно сказать программный код, данные
 - Глобальная переменная
 - Реализация функций(но не шаблонных, хотя при желании)
 - Реализация Классов.
 - Реализация Структур.

Вывод таков.
.c/.cpp содержат программный код(данные, переменные) которые линковщик будет линковать для получения исполняемого файла(exe, dll, sys ... )
.h/.hpp содержат только объявления, и линковщик грубо говоря об них не знает, так что программный код(данные), не могут попасть в исполняемый файл(exe, dll, sys ... ).
Шаблонный генерируется во время компиляции и за это отвечает компилятор, так что как он его слинкует это его задача.

Но в целом все придет с опытом.

PM MAIL WWW   Вверх
mes
Дата 7.9.2010, 19:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(icecrashldr @  7.9.2010,  18:43 Найти цитируемый пост)
.h/.hpp содержат только объявления, и линковщик грубо говоря об них не знает, так что программный код(данные), не могут попасть в исполняемый файл

как сказано  smile 


--------------------
PM MAIL WWW   Вверх
jonie
Дата 8.9.2010, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата


.h/.hpp содержат только объявления, и линковщик грубо говоря об них не знает, так что программный код(данные), не могут попасть в исполняемый файл(exe, dll, sys ... ).

да ну?
Код

//inc.h
#pragma once
int a;

//inc.cpp
#include inc.h
a=200;



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
azesmcar
Дата 8.9.2010, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(icecrashldr @  7.9.2010,  19:43 Найти цитируемый пост)
.h/.hpp содержат только объявления, и линковщик грубо говоря об них не знает, так что программный код(данные), не могут попасть в исполняемый файл(exe, dll, sys ... ).

а ничего, что сам заголовочный файл попадает в c/cpp при include-е еще во время работы препроцессора?

Цитата(icecrashldr @  7.9.2010,  19:43 Найти цитируемый пост)
.c/.cpp файлы могут выступать в роли заголовком

файл в любым расширением может выступать в роли заголовочного, но дело не в расширении файла а в его содержании.

Это сообщение отредактировал(а) azesmcar - 8.9.2010, 08:12
PM   Вверх
icecrashldr
Дата 8.9.2010, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



1)
mes, Как?

2)
jonie, А теперь сделай использования переменной из двух .c/.cpp файлов ... 

3)
azesmcar, 
Цитата

а ничего, что сам заголовочный файл попадает в c/cpp при include-е еще во время работы препроцессора?

 smile , вовсе нет. Заголовочный файл выступает как связующий, то и есть объявляем но не реализуем...


Цитата

файл в любым расширением может выступать в роли заголовочного, но дело не в расширении файла а в его содержании.

Согласен. Но бывают случаи когда .c/.cpp с реализацией выступает в роли заголовочных. Файл реализации как заголовочный? Как то запутано ...  smile . 
Это метод с основном применяется на "С" как альтернатива , шаблонам.
PM MAIL WWW   Вверх
azesmcar
Дата 8.9.2010, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(icecrashldr @  8.9.2010,  10:34 Найти цитируемый пост)
, вовсе нет. Заголовочный файл выступает как связующий, то и есть объявляем но не реализуем

это показывает фундаментальное непонимание работы макроса include.

#include на самом деле не делает ничего сверхъестественного, он берет содержание включаемого файла и вставляет его вместо директивы include. Все просто до безобразия
Цитата(C++ Standard)

#include <h-char-sequence> new-line

searches   a   sequence   of   implementation-defined   places   for   a   header   identified   uniquely   by   the   specified 
sequence between the <and >delimiters, and causes the replacement of that directive by the entire contents 
of the header
.   How the places are specified or the header identified is implementation-defined. 


Добавлено через 1 минуту и 43 секунды
Цитата(icecrashldr @  8.9.2010,  10:34 Найти цитируемый пост)
Но бывают случаи когда .c/.cpp с реализацией выступает в роли заголовочных. 

Что значит "бывают случаи"? Может лучше так - "есть код, в котором..." и так далее, но это не значит что так правильно.
PM   Вверх
djamshud
Дата 8.9.2010, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Я окончательно понял смысл разделения h/cpp только после того, как вкурил, как работает компилятор и линковщик. Имеется в виду не теория компиляторов, а последовательность и смысл действий компилятора и линковщика во время сборки программы.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
bsa
Дата 8.9.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(djamshud @  8.9.2010,  12:31 Найти цитируемый пост)
Я окончательно понял смысл разделения h/cpp только после того, как вкурил, как работает компилятор и линковщик.

Значит ТС рекомендуется почитать Этапы сборки программы
PM   Вверх
icecrashldr
Дата 8.9.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



azesmcar, Пальцем в небо ... 

Цитата


это показывает фундаментальное непонимание работы макроса include.

#include на самом деле не делает ничего сверхъестественного, он берет содержание включаемого файла и вставляет его вместо директивы include. Все просто до безобразия

Понятное дело что не заголовочный файл делает связь между .cpp и другой реализацией. 
Читаем внимательно
Цитата

Заголовочный файл выступает как связующий

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



Цитата

Что значит "бывают случаи"? Может лучше так - "есть код, в котором..." и так далее, но это не значит что так правильно. 

Правильно? А где говорится что это не правильно? 
Бывают случаи когда так сделать рациональней.
например реализация 32,64 - bits, Вперед генерировать кучу кода, когда как раз он красиво разруливается "реализацией выступает в роли заголовочных."


PM MAIL WWW   Вверх
bsa
Дата 8.9.2010, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(icecrashldr @  8.9.2010,  18:10 Найти цитируемый пост)
например реализация 32,64 - bits, Вперед генерировать кучу кода, когда как раз он красиво разруливается "реализацией выступает в роли заголовочных."
Если писать без ошибок строго следуя стандарту, то проблем с "реализацией" никаких не будет. И не надо ничего лишнего подключать - максимум ifdef/else/endif.

PM   Вверх
KuMa1104
Дата 8.9.2010, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



Хм. дауж много опасных нюансов.

Похоже что разделение кода на .h/.cpp часто представляет для программиста с++ место потенциальных ошибок.

Как я понимаю за удобство разделения внешнего интерфейса от реализации приходится платить немалую цену.

Буду иметь в виду, спасибо всем за ваши ответы.

Это сообщение отредактировал(а) KuMa1104 - 8.9.2010, 23:13


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
xvr
Дата 9.9.2010, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(KuMa1104 @  8.9.2010,  23:10 Найти цитируемый пост)
Как я понимаю за удобство разделения внешнего интерфейса от реализации 
Это не удобство, а суровая необходимость. Если конечно вся программа не состоит из одного файла и не является 'Hello world'
Цитата

приходится платить немалую цену.
Вообще то это бесплатно, хотя надо понимать ЧТО именно ты делаешь (как и в программировании вообще)

PM MAIL   Вверх
bsa
Дата 9.9.2010, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(KuMa1104 @  9.9.2010,  00:10 Найти цитируемый пост)
Хм. дауж много опасных нюансов.

Опасных тут нет. Нюансов много, но если все объявления пихать в хидер, а всю реализацию в cpp, то проблем у тебя никаких не будет. Нюансы начинаются с того момента, когда ты захочешь не все объявления пихать в хидер. Но к тому моменту, скорее всего, ты уже будешь о них знать по собственному опыту.
PM   Вверх
rudvil
Дата 12.9.2010, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Тоже стало интерестно, а именно: я что-нибудь выйграю если разобью большой класс(без шаблонов, также он не будет использоваться как библиотека) на h/cpp.
--------------------
xor
PM MAIL Skype   Вверх
kemiisto
Дата 12.9.2010, 17:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



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

С++ is so 90s! smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
rudvil
Дата 12.9.2010, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(kemiisto @ 12.9.2010,  17:40)
rudvil, куда больше Вы выиграете от того, что узнаете, что в 21 веке ручное разделения класса/модуля на интерфейс и реализацию не считается приличным. 

С++ is so 90s! smile

Вот оно что, а я то думал что boost все в *.hpp держит только из-за использования шаблонов.
Спасибо что просветили  smile
--------------------
xor
PM MAIL Skype   Вверх
kemiisto
Дата 12.9.2010, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



rudvil, боюсь Вы не поняли... Или может я уже чего-то не понимаю... smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
rudvil
Дата 12.9.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(kemiisto @ 12.9.2010,  18:29)
rudvil, боюсь Вы не поняли... Или может я уже чего-то не понимаю... smile

Да, я не совсем то написал, хотел сказать - что реализация как в яве  smile  т.е. без
Цитата
разделения класса/модуля на интерфейс и реализацию

опять же если я правильно вас понял.

Это сообщение отредактировал(а) rudvil - 12.9.2010, 21:42
--------------------
xor
PM MAIL Skype   Вверх
bsa
Дата 12.9.2010, 21:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



rudvil, кстати, шаблонные классы разделять на обявление и реализацию не стоит - реализация шаблона должна быть доступна во всех единицах трансляции, где он используется.
PM   Вверх
Muerto
Дата 13.9.2010, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: нет
Всего: 4



Простите за тупой вопрос... но собственно в чем вообще преимущество интерфейсов?

Читаю сейчас книгу освой с++ за 21 день, так так советуют интерфейс пихнуть в .hpp а реализацию оставить...
Моя здравая логика говорит что - правильней наоборот...
Когда человек открывает прогу и у него есть интерфейс struct класса, так ему понятно что функции делают...

Это куда лучше чем смотреть 1000 строк кода реализации...


--------------------
user posted image
PM MAIL   Вверх
borisbn
Дата 13.9.2010, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Muerto @  13.9.2010,  12:01 Найти цитируемый пост)
 но собственно в чем вообще преимущество интерфейсов?

ты сам ответил
Цитата(Muerto @  13.9.2010,  12:01 Найти цитируемый пост)
Когда человек открывает прогу и у него есть интерфейс struct класса, так ему понятно что функции делают...Это куда лучше чем смотреть 1000 строк кода реализации...

это, правда, не основное и не единственное преимущество.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
baldina
Дата 13.9.2010, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата

разделение кода на .h/.cpp

напрямую связано с понятием "раздельная компиляция", т.е. каждый cpp компилируется отдельно, и о содержимом других файлов проекта компилятор не подозревает (в других языках могут использоваться иные модели и правила, например сборки С#). 

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

Цитата

ссылочку на статью в которои доходчиво описывается разделение кода на .h/.cpp

в любой книжке по С++ про это довольно доходчиво написано - Прата, Страуструп и иные...
например тут

Добавлено через 11 минут и 23 секунды
объявление (declaration), требуемое перед использованием суть интерфейс (типа, переменной, функции, шаблона). определение (definition) - реализация. таким образом помещая объявления в заголовок мы разделяем интерфейс и реализацию. это другая сторона вопроса, чуть иной подход. таким образом механизмы и правила (хорошего тона) языка способствуют правильному подходу к программированию.
Цитата

но собственно в чем вообще преимущество интерфейсов?

в том, что на телевизоре 4 кнопки (это интерфейс) и для его управления достаточно знать, что они делают, а не разбираться в электронной схеме (реализация)
PM MAIL   Вверх
baldina
Дата 13.9.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(bsa @ 12.9.2010,  21:49)
rudvil, кстати, шаблонные классы разделять на обявление и реализацию не стоит - реализация шаблона должна быть доступна во всех единицах трансляции, где он используется.

при этом слова "где он используется" может означать не совсем ожидаемые вещи smile

тут

Это сообщение отредактировал(а) baldina - 13.9.2010, 15:31
PM MAIL   Вверх
JackYF
Дата 15.9.2010, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162




 ! 
JackYF
Оффтопик ушёл в раздел "Общие вопросы".



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.3987 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.