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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание своей библиотеки функций в .h и .cpp 
:(
    Опции темы
HexoGenus
Дата 17.7.2003, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

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



Как сделать файлы хранящие набор функций?

Можно подключить файл *.cpp к проекту через менеджер проекта и потом в нужных формах подключать при помощи
#include "*.h"
описания своих функций ...

а можно обойтись для подключения своей библиотеки одной командой
#include
?

Это сообщение отредактировал(а) HexoGenus - 17.7.2003, 18:30
--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
kruchinin
Дата 17.7.2003, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Можно просто все функции перечислить в *.h файле или как ты говорил подключать *.cpp файл или линковать библиотеку и подключать lib.
PM MAIL   Вверх
HexoGenus
Дата 19.7.2003, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

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



Хммм ... а для того что бы сделать ракету нужно трубку набить горючим и поджечь...
Извини, но не понял я из твоего объяснения ничего sad.gif
Не можешь объяснить или дать ссылочку? Очень прошу...

Нужна нам например функция cos()
я пишу в коде формы #include "math.h" и можно в любом событии формы использовать функцию cos() и вроде там никакого lib файла нет ...
(на всякий случай уточнил, а то может вы подумали что я dll имел в виду)

А то как то странно получается программировать на с++ и не использовать самой крутой его возможности - создавать свой набор функций...



--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
DENNN
Дата 19.7.2003, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
а можно обойтись для подключения своей библиотеки одной командой
#include
?

Обычно пишут один файл *.h в котором содержатся #include для всех остальных файлов библиотеки.

Но если лень написать даже одну строчку с #include..., то этот форум не поможет smile.gif
PM ICQ   Вверх
HexoGenus
Дата 19.7.2003, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

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



Хмммм.... а сам то пробовалconfused.gif
все прекрасно работает пока ты этот файл подключаешь только на одной форме... а если его подключить на нескольких формах то билдер выдает ошибку... пишет что то про повторное описание одной функции на нескольких формах...
А насчет "то этот форум не поможет "
я на форумах вопросы очень редко задаю, чаще пытаюсь ответить smile.gif
Просто бывают подводные камни наткнувшись на которые один раз потом годами обходишь целую акваторию...
--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 19.7.2003, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 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
Цитата
Нужна нам например функция cos()
я пишу в коде формы #include "math.h" и можно в любом событии формы использовать функцию cos() и вроде там никакого lib файла нет ...

все функции, объявленные в math.h, входят в стандартную библиотеку


--------------------
qqq
PM WWW   Вверх
DENNN
Дата 19.7.2003, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
все прекрасно работает пока ты этот файл подключаешь только на одной форме... а если его подключить на нескольких формах то билдер выдает ошибку... пишет что то про повторное описание одной функции на нескольких формах...

Не знаю что-там в билдере, но файл заголовков действительно добавляется один раз.
Если ты посмотришь внимательно на заголовочные файлы из стандартной библиотеки, то в начале и в конце каждого файла можно увидеть строки вида:
Код

//файл stdio.h (условный пример)
#ifndef _stdio_h_bla_bla_bla
#define _stdio_h_bla_bla_bla
.....
//здесь собственно сам файл
......
#endif

Это сделано специально для того, чтоб не сильно напрягаться при подключении заголовочных файлов. Но лучше все-таки "глобальные" библиотеки подключать в коде один раз в самом начале компиляции - и код будет более удобо читаем и на компилятор нагрузки поменьше.

Так что желаю не "блуждать по акваториям"! smile.gif

Это сообщение отредактировал(а) DENNN - 19.7.2003, 21:37
PM ICQ   Вверх
Kefir
Дата 20.7.2003, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«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
или надо что-либо ещё прописать?
PM MAIL WWW Skype   Вверх
kruchinin
Дата 20.7.2003, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ничего!
Это означает:
Если переменная _THIS_H_FILE_ не была определена раньше (т.е. этот файл не открывался), то она определяется и соответсвенно все другие функции и определения.
Т.е. при повторном открытии файла никакой ошибки типа "что то про повторное описание одной функции " не будет!
PM MAIL   Вверх
RAN
Дата 20.7.2003, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 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.
PM MAIL ICQ   Вверх
DENNN
Дата 21.7.2003, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
него компилятор выдаёт ошибку на разных формах, то есть в разных cpp-файлах. А ваша конструкция защищает лишь от повторного определения в пределах файла и для глобальных функций и переменных не подходит.
Честно говоря ничего не понял. Если можешь оъясни для глупых подробнее smile.gif.

Цитата
Сам не пробовал, но теоретически для этого надо написать свою C Run-time (CRT) библиотеку, которая будет поключаться вместо стандартной.

Написать бибилиотеку надо не вместо стандартной, а просто собственную, где создан некоторый универсальный набор функций классов и методов.
Цитата
Короче проще lib подключить.

Чем проще непонятно, вроде проще написать строку #include ....., не проблем с DEBUG и RELEASE, код всегда можно легко исправить, при отладке 100% можно "попасть" внутр библиотеки (а значит быстрее найти ошибку) и, самое главное для любого программера, такую библиотеку можно сделать переносимой между разными средствами разработки (если конечно код хорошо написан ;) )
PM ICQ   Вверх
maxim1000
Дата 21.7.2003, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



не совсем понимаю, в чем сложность с созданием и использованием своих библиотек функций:
1. делаем *.cpp файл, в нем пишем нужные нам функции
2. делаем *.h файл, объявляем в нем все наши функции
3. *.cpp подключаем в проект (совсем необязательно отказываться от использования стандартных библиотек)
4. в тех файлах, где будут использоваться функции из библиотеки подключаем *.h файл с помощью include
5. все...


--------------------
qqq
PM WWW   Вверх
HexoGenus
Дата 21.7.2003, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

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



DENNN огромное спасибо за твое желание помочь но судя по всему ты не пробовал то что предлагаешь... Как сказал RAN #include в данном случае не помогает ... не веришь попробуй ...
File: myfunction.h
Код

#include "Windows.h"

#ifndef MyFunct
#define MyFunct

void MyMes(char *);

void MyMes(char *szText)
{
MessageBox(NULL, szText, "Warning", MB_OK | MB_ICONWARNING);
}

#endif


и потом подключаем и используем на форме

Код

#include "myfunction.h"

void __fastcall TForm2::Button1Click(TObject *Sender)
{
char Mes1[]="Ошибка в структуре базы данных!";
MyMes(Mes1);

}


Для упрощения задачи я и код и описание совместил в *.h файле...

При использовании на одной форме все прекрасно работает ...
Примерно таким образом я пробовал составлять библиотеки функций еще когда кодил на borland c++ под DOS

Но стоит вставить код на вторую форму и все ... начинаются траблы...

maxim1000 Спасибо за то что привел более доходчиво тот способ который я сейчас и использую... может теперь большее количество людей поймет чего я хочу и может кто знает как обойти эту фишку sad.gif
потому что этот способ хорош при наличии 10 или 100 функций... а когда их больше? в этом случае функции было бы удобно разбросать по тематическим файлам но представьте какое удовольствие потом подключать все cpp файлы при помощи менеджера проекта ... бррр...

Вобщем очень жду ваших идей smile.gif потому что написать свою VCL я просто не в силах smile.gif

--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
RAN
Дата 21.7.2003, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

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



Короче, не будем дальше обсуждать способ, при котором надо свой рантайм писать, поскольку сложно и многим даже не понятно о чём речь идёт. Скажу лишь, что говоря
Цитата
Короче проще lib подключить
, я имел ввиду, что проще lib или cpp (кому как нравится) подключить к проекту, чем рантайм лопатить.

По поводу глобальных функций и переменных. Как известно, существует такая вещь, как область видимости. Глобальная переменная может быть только одна во всём проекте. Все #define будут действовать в пределах cpp-файла. То есть
Код

файл test.h
#ifndef TEST_H
#define TEST_H
...............
#endif

-------------------------------------------------

файл test1.cpp

#include "test.h"
.........................

-------------------------------------------------

файл test2.cpp

#include "test.h"


текст test.h будет включён в оба файла и если в test.h написать, например int x; , то это вызовет ошибку две глобальные переменные в одном проекте при компановке. Можно писать static int x;, тогда ошибки не будет, но это будут совершенно разные переменные. Кстати это касается и функций, если объявить функцию как static, то она будет видна только в пределах файла, но, чесно говоря, я не знаю зачем может это понадобиться в h-файле.

Вывод:
В h-файлы позволительно писать, только описания функций и переменных (extern int x; а сама int x в cpp).

Пример HexoGenus'а
Код

#include "Windows.h"

#ifndef MyFunct
#define MyFunct

void MyMes(char *);

void MyMes(char *szText)
{
MessageBox(NULL, szText, "Warning", MB_OK | MB_ICONWARNING);
}

#endif


Надо переписать так
MyFunc.h
Код

#ifndef MyFunct
#define MyFunct
#include "Windows.h"

void MyMes(char *);

#endif

MyFunc.cpp
Код

#include "MyFunc.h"

void MyMes(char *szText)
{
MessageBox(NULL, szText, "Warning", MB_OK | MB_ICONWARNING);
}


Теперь включай h - файл куда угодно, сколько угодно.

P.S. Простите если опять сложно, но по другому не смог.
PM MAIL ICQ   Вверх
DENNN
Дата 22.7.2003, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



OK, не буду оправдываться smile.gif
PM ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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