|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.11.2011, 17:52 | #1 |
Форумчанин
Регистрация: 28.05.2011
Сообщений: 309
|
Создание библиотек. Файлы ".h".
Доброго времени суток, господа!
Решил более структурировано писать на С++. Я начинающий. 1.Файлы .h, которые подключаются в начале кода, зачем они нужны. Это библиотеки, или заголовки? 2.В чем разница библиотек и заголовков? 3.Допустим у меня есть 10 ф-ций, я хочу вынести их в отделенный файл (библиотеку). Как это все реализовать ? Заранее спасибо, господа.
Спеши медленно.
|
03.11.2011, 17:57 | #2 | |||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
заголовочник. он содержить(поидее должен) только обьявления функций/типов и тп.(искл шаблоны) Цитата:
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|||
03.11.2011, 18:36 | #3 |
Форумчанин
Регистрация: 28.05.2011
Сообщений: 309
|
Спасибо.
Но какова роль .h файлов? Они как то связаны с библиотекой, верно? Комилю я в Борланд Билдере 6.. Но как сделать свою библиотеку в которой подряд будут просто написана ф-ции и процедуры, и что бы я подключал этот файл к основной проге и просто вызывал эти ф-ции.. ??
Спеши медленно.
|
03.11.2011, 18:51 | #4 | |||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Цитата:
Цитата:
про борланд не знаю. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|||
03.11.2011, 20:59 | #5 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Во-первых, если только у Вас нет веских причин держаться Борланда, уйдите с него. Дело в том, что господа Embarcadero пытались "усовершенствовать" C++, создав при этом заметно отличающийся диалект; часть этих наработок ушла в язык C#.
Как альтернативы, можно рассматривать Qt от Trolltech-Nokia или C++ express от Microsoft. Во-вторых. В рамках одного проекта все современные среды разработки позволяют с лёгкостью использовать множественные файлы кода (Borland называет их Units). Это удобно, так как позволяет часть кода сосредоточить в одном "модуле", в который (если код в нём выверен и отлажен) заглядывать в дальнейшем не понадобится, а надо будет только вызывать функции. Кроме того, это позволяет скомпилировать код из файла в "почти" машинный код один раз, и лишь чуть-чуть менять при изменении прочих частей проекта, что сокращает время компиляции (не самый большой выигрыш на маленьких модулях, но привыкать полезно сразу). Однако кроме сгенерированного "почти машинного" кода, коль скоро мы компилируем модули поштучно, нужно уметь объяснять компилятору, что вызов такой-то функции, которой в текущем модуле нет, действие тем не менее легальное - она встретится в будущем. Рассмотрим пример: мы собрались написать несколько полезных функций для вычислений в отдельном модуле. В файле MyMath.cpp пишем: Код:
Код:
Во-вторых, обратите внимание на комментарии к функциям: они явно распадаются на две части - как функцию использовать (то, что интересно при использовании модуля, интерфейс) и как она реализована (то, что интересно при написании модуля, реализация). Второе есть желание скрыть - какое дело использующему библиотеку, как именно я её создавал? В-третьих, при этом любому пользователю модуля-библиотеки неизбежно открываются подробности, которые ему лучше бы не знать - например, информация о существовании g_factorialValues. От этого недалеко до того, чтобы обратиться к массиву самому, после чего я решу по какой-то причине переписать реализацию факториала, не меняя интерфейс и считая, что теперь достаточно только пересобрать проект - а вместо этого здравствуйте, ошибки в программе! |
03.11.2011, 20:59 | #6 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Поэтому библиотеку можно переписать, разбив на два файла:
MyMath.h Код:
Директива препроцессора #include "Имя файла" берёт текст файла и вставляет его вместо этой строки, это простая текстовая замена в исходном коде (как и большинство инструкций препроцессора). То есть, файл Program.cpp теперь видоизменился: Код:
Теперь пара замечаний. 1) Из-за того, что #include подставляет вместо себя текст файла, в заголовочных файлах категорически не рекомендуется использовать директиву using namespace. В cpp-файлах это делать можно, но после последней из директив #include. 2) При сложной структуре включений, может получиться так, что один и тот же заголовочный файл в данном модуле возникнет в двух экземплярах. Два одинаковых объявления - это ошибка, так что препроцессору в заголовочном файле надо как-то сказать "эй, если при обработке текущего (.cpp) файла меня уже видел, всё, второй раз подставлять не надо". Классическое решение - т.н. "стражи включения". В начало MyMath.h пишем Код:
Код:
Могут быть доступны и другие способы - так, в Visual Studio достаточно написать в начале файла #pragma once. |
03.11.2011, 21:26 | #7 | |
Форумчанин
Регистрация: 28.05.2011
Сообщений: 309
|
Abstraction, благодарю Вас за объяснение! Прекрасно объяснили!
Цитата:
И почему следует закинуть его? В принципе я могу и в MS Visual Studio(ее я не люблю!!), могу под линью писать и компилить gcc. Но что вызвало такое к Борланду?
Спеши медленно.
|
|
03.11.2011, 21:51 | #8 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Объяснение приведено: у Borland немного свой диалект C++, поэтому для учебных целей его использовать не самая лучшая идея. Главный кошмар - индексы, потому что Borland во многом наследник Delphi, в итоге, когда я на нём пишу, развлечение "угадай, какой индекс имеет первый элемент этого массива" предоставляется в достойных изумления количествах (AnsiString, скажем). Поскольку "недолёт/перелёт на единицу" и так достаточно частая проблема, я бы не усугублял.
Кроме того, Borland C++ 6 (это уже лично у меня) пару раз падал, настойчиво требует права администратора для работы, на днях поставил рекорд в номинации "самая тормозная подстановка по Ctrl+Space", приложение тащит за собой борландовские .bpl-библиотеки (причём отдельным пунктом идёт весёлая игра "угадай, из чего состоит минимальный набор"), автоподстановка как-то болезненно реагирует на шаблоны, запрещено встраивание (inlining) функций, содержащих циклы (за что?!), отрисовываемые формы не дружат с Aero... Сверх того, у него всё-таки устаревший отладчик: при вылете за пределы массива в режиме отладки мне маловато проку от ассемблерного кода, я в него лезть не хочу. Ничего фатального, конечно, но неприятно, неприятно. |
03.11.2011, 21:56 | #9 |
Форумчанин
Регистрация: 28.05.2011
Сообщений: 309
|
А что бы Вы посоветовали ?
Но с учетом того что "понадобиться в будущем".
Спеши медленно.
|
03.11.2011, 22:12 | #10 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" | aleksei78 | Microsoft Office Excel | 13 | 25.08.2009 12:04 |
настроить при открытии Excel 2003 в окошке "Тип файлов" вывод пункта "Все файлы (*.*)" по умолчанию? | Unior | Microsoft Office Excel | 2 | 01.03.2009 02:42 |
"Текстовые файлы" и "Графика и подпрограммы" | Nata!!!@ | Помощь студентам | 5 | 05.12.2007 18:17 |