![]() |
|
Модераторы: 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 |
|
||||
|
|||||
![]()
|
| Правила форума "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. |