![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| HexoGenus |
|
|||
![]() Шустрый ![]() Профиль Группа: Экс. модератор Сообщений: 110 Регистрация: 28.8.2002 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Как сделать файлы хранящие набор функций?
Можно подключить файл *.cpp к проекту через менеджер проекта и потом в нужных формах подключать при помощи #include "*.h" описания своих функций ... а можно обойтись для подключения своей библиотеки одной командой #include ? Это сообщение отредактировал(а) HexoGenus - 17.7.2003, 18:30 --------------------
Когда невозможно уже работать напряженнее, начни работать умнее. |
|||
|
||||
| kruchinin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 19.4.2003 Репутация: нет Всего: нет |
Можно просто все функции перечислить в *.h файле или как ты говорил подключать *.cpp файл или линковать библиотеку и подключать lib.
|
|||
|
||||
| HexoGenus |
|
|||
![]() Шустрый ![]() Профиль Группа: Экс. модератор Сообщений: 110 Регистрация: 28.8.2002 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Хммм ... а для того что бы сделать ракету нужно трубку набить горючим и поджечь...
Извини, но не понял я из твоего объяснения ничего Не можешь объяснить или дать ссылочку? Очень прошу... Нужна нам например функция cos() я пишу в коде формы #include "math.h" и можно в любом событии формы использовать функцию cos() и вроде там никакого lib файла нет ... (на всякий случай уточнил, а то может вы подумали что я dll имел в виду) А то как то странно получается программировать на с++ и не использовать самой крутой его возможности - создавать свой набор функций... --------------------
Когда невозможно уже работать напряженнее, начни работать умнее. |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Обычно пишут один файл *.h в котором содержатся #include для всех остальных файлов библиотеки. Но если лень написать даже одну строчку с #include..., то этот форум не поможет |
|||
|
||||
| HexoGenus |
|
|||
![]() Шустрый ![]() Профиль Группа: Экс. модератор Сообщений: 110 Регистрация: 28.8.2002 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Хмммм.... а сам то пробовал
все прекрасно работает пока ты этот файл подключаешь только на одной форме... а если его подключить на нескольких формах то билдер выдает ошибку... пишет что то про повторное описание одной функции на нескольких формах... А насчет "то этот форум не поможет " я на форумах вопросы очень редко задаю, чаще пытаюсь ответить Просто бывают подводные камни наткнувшись на которые один раз потом годами обходишь целую акваторию... --------------------
Когда невозможно уже работать напряженнее, начни работать умнее. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
Я так понимаю, что здесь имеется что-то вроде uses в Pascal
В C/C++ такого нет. Дело в том, что в Pascal модуль содержит две части: interface и implementation поэтому достаточно подключить только его В C/C++ для использования внешней функции нужно: 1. добавить файл, где она реализована, (*.cpp, *.lib, *.obj) в проект 2. объявить функцию в том файле, где она будет использоваться обычно в файле много функций, поэтому пишут отдельный файл *.h с объявлениями всех функций, чтобы одной строкой объявить все функции вот и получается, что файл *.h - аналог interface'ной части модуля в Pascal, а файл с реализацими функций - implementation
все функции, объявленные в math.h, входят в стандартную библиотеку -------------------- qqq |
|||
|
||||
| DENNN |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Не знаю что-там в билдере, но файл заголовков действительно добавляется один раз. Если ты посмотришь внимательно на заголовочные файлы из стандартной библиотеки, то в начале и в конце каждого файла можно увидеть строки вида:
Это сделано специально для того, чтоб не сильно напрягаться при подключении заголовочных файлов. Но лучше все-таки "глобальные" библиотеки подключать в коде один раз в самом начале компиляции - и код будет более удобо читаем и на компилятор нагрузки поменьше. Так что желаю не "блуждать по акваториям"! Это сообщение отредактировал(а) DENNN - 19.7.2003, 21:37 |
||||
|
|||||
| Kefir |
|
|||
|
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: нет Всего: 87 |
DENNN, кстати, если самому делать штуку типа #ifndef _stdio_h_bla_bla_bla, то я так понимаю, что это довольно просто:
сначала #ifndef _THIS_H_FILE_ #define _THIS_H_FILE_ .....как ты и сказал, тут весь файл..... #endif или надо что-либо ещё прописать? |
|||
|
||||
| kruchinin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 19.4.2003 Репутация: нет Всего: нет |
Ничего!
Это означает: Если переменная _THIS_H_FILE_ не была определена раньше (т.е. этот файл не открывался), то она определяется и соответсвенно все другие функции и определения. Т.е. при повторном открытии файла никакой ошибки типа "что то про повторное описание одной функции " не будет! |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
DENNN & kruchinin, скорее всего у HexoGenus'а дело в другом. У него компилятор выдаёт ошибку на разных формах, то есть в разных cpp-файлах. А ваша конструкция защищает лишь от повторного определения в пределах файла и для глобальных функций и переменных не подходит. Просто в h-файлы такие вещи включать нельзя, но об этом мало где пишут и я, например, тоже в своё время учился писать h - файлы на ошибках.
По поводу того, можно ли создать свою библиотеку, скажу, что по-моему можно. Сам не пробовал, но теоретически для этого надо написать свою C Run-time (CRT) библиотеку, которая будет поключаться вместо стандартной. Но в случае HexoGenus'а это не обосновано, поскольку он использует VCL, а значит у него и CRT с поддержкой VCL, то есть я хочу сказать придётся от VCL и стандартных функций C/C++ (memset, itoa и даже new) отказаться, либо явно включать их в проект, кроме того проект надо настроить так, чтоб твоя CRT подключалась. Короче проще lib подключить. А вообще я когда-то об этом в интернете читал, так там предлагалось CRT отключать, чтоб не раздувать код и пользоваться только API. |
|||
|
||||
| DENNN |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Написать бибилиотеку надо не вместо стандартной, а просто собственную, где создан некоторый универсальный набор функций классов и методов.
Чем проще непонятно, вроде проще написать строку #include ....., не проблем с DEBUG и RELEASE, код всегда можно легко исправить, при отладке 100% можно "попасть" внутр библиотеки (а значит быстрее найти ошибку) и, самое главное для любого программера, такую библиотеку можно сделать переносимой между разными средствами разработки (если конечно код хорошо написан ;) ) |
||||||
|
|||||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
не совсем понимаю, в чем сложность с созданием и использованием своих библиотек функций:
1. делаем *.cpp файл, в нем пишем нужные нам функции 2. делаем *.h файл, объявляем в нем все наши функции 3. *.cpp подключаем в проект (совсем необязательно отказываться от использования стандартных библиотек) 4. в тех файлах, где будут использоваться функции из библиотеки подключаем *.h файл с помощью include 5. все... -------------------- qqq |
|||
|
||||
| HexoGenus |
|
||||
![]() Шустрый ![]() Профиль Группа: Экс. модератор Сообщений: 110 Регистрация: 28.8.2002 Где: Ростов-на-Дону Репутация: нет Всего: нет |
DENNN огромное спасибо за твое желание помочь но судя по всему ты не пробовал то что предлагаешь... Как сказал RAN #include в данном случае не помогает ... не веришь попробуй ...
File: myfunction.h
и потом подключаем и используем на форме
Для упрощения задачи я и код и описание совместил в *.h файле... При использовании на одной форме все прекрасно работает ... Примерно таким образом я пробовал составлять библиотеки функций еще когда кодил на borland c++ под DOS Но стоит вставить код на вторую форму и все ... начинаются траблы... maxim1000 Спасибо за то что привел более доходчиво тот способ который я сейчас и использую... может теперь большее количество людей поймет чего я хочу и может кто знает как обойти эту фишку потому что этот способ хорош при наличии 10 или 100 функций... а когда их больше? в этом случае функции было бы удобно разбросать по тематическим файлам но представьте какое удовольствие потом подключать все cpp файлы при помощи менеджера проекта ... бррр... Вобщем очень жду ваших идей --------------------
Когда невозможно уже работать напряженнее, начни работать умнее. |
||||
|
|||||
| RAN |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Короче, не будем дальше обсуждать способ, при котором надо свой рантайм писать, поскольку сложно и многим даже не понятно о чём речь идёт. Скажу лишь, что говоря
По поводу глобальных функций и переменных. Как известно, существует такая вещь, как область видимости. Глобальная переменная может быть только одна во всём проекте. Все #define будут действовать в пределах cpp-файла. То есть
текст test.h будет включён в оба файла и если в test.h написать, например int x; , то это вызовет ошибку две глобальные переменные в одном проекте при компановке. Можно писать static int x;, тогда ошибки не будет, но это будут совершенно разные переменные. Кстати это касается и функций, если объявить функцию как static, то она будет видна только в пределах файла, но, чесно говоря, я не знаю зачем может это понадобиться в h-файле. Вывод: В h-файлы позволительно писать, только описания функций и переменных (extern int x; а сама int x в cpp). Пример HexoGenus'а
Надо переписать так MyFunc.h
MyFunc.cpp
Теперь включай h - файл куда угодно, сколько угодно. P.S. Простите если опять сложно, но по другому не смог. |
||||||||||
|
|||||||||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
OK, не буду оправдываться
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |