Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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