Модераторы: 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   Вверх
maxim1000
Дата 22.7.2003, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
в этом случае функции было бы удобно разбросать по тематическим файлам но представьте какое удовольствие потом подключать все cpp файлы при помощи менеджера проекта ... бррр...

в этом случае можно их всех собрать в один *.lib и подключать только его
не знаю, как в Builder, а в VC я делаю проект library типа Win32 Static Library, в него включаю кучу файлов *.cpp, компилирую его один раз, а полученный *.lib файл добавляю в те проекты, где он нужен


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


Шустрый
*


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

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



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


Хммм... только перед тем как включать нужно зайти 100 раз в менеджер проектов и добавить 100 cpp файлов и так в каждом новом проекте... это что я программист или оператор машинного доенияconfused.gif неужели нет способа подключать cpp файлы в виде одного списка?

сейчас пытаюсь заставить билдер воспринимать команду USEUNIT но он почему-то не дает использовать ее в подключаемом файле (кажется она не признает вложений) можно конечно держать список из
USEUNIT ("name1.cpp");
USEUNIT ("name2.cpp");
USEUNIT ("name3.cpp");
в отдельном файле а потом копировать в каждый проект, но это все равно не красиво sad.gif

есть вариант
copy *.cpp myfunct.cpp
и потом подключать этот файл...
но тоже коряво...

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

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


Эксперт
****


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

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



Цитата
нет способа подключать cpp файлы в виде одного списка?

Цитата
в этом случае можно их всех собрать в один *.lib и подключать только его



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


Эксперт
****


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

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



Долго еще будете велосипед изобретать?
PM ICQ   Вверх
HexoGenus
Дата 22.7.2003, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



maxim1000 Извини smile.gif я твое сообщение не видел потому что в это время еще писал свое smile.gif спасибо попробую разобраться...

DENNN не знаю почему это для тебя является велосипедом, может ты lib файлы каждый день используешь а я про них что то слышал но даже не знал зачем нужны, теперь понял и буду разбираться smile.gif Если такие "простые" вопросы кого-то оскорбляют выделите детскую комнату форума где можно их задавать, но неужели в моем вопросе было что-то очень простое? У меня вообще-то как раз сложилось впечатление что никто не может найти решения и поэтому многие из тех кто программирует в билдере выкручиваются далеко не изящными способами... Мне кажется что богаж знаний программиста складывается из 3 чемоданов:
1. Знания в голове
2. Сборники документации
3. Свои библиотеки функций

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

maxim1000 еще раз спасибо!

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


Эксперт
****


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

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



Просто в любом классическом справочнике говориться, что в заголовочном файле хранятся объявления функций , а в cpp их реализация. Это первое с чего у нас пошел спор. А детская комната я думаю не нужна smile.gif
PM ICQ   Вверх
HexoGenus
Дата 22.7.2003, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот меня как раз и стесняет то что во всех классических книжках по билдеру хорошо расписывается как при помощи #include подключать описания функций в *.h файлах но нигде не говориться как подключать *.cpp файлы которые им соответствуют. А ведь если рассмотрим любой *.h файл то в нем куча подключений через include других *.h файлов.
Получается что, при подключении через include всего одного *.h файла нужно подключить целую кучу *.cpp файлов через менеджер проекта...
Так что все же надеюсь что пока я пытаюсь разобраться с lib файлами ктонибудь подскажет как грамотно подключать cpp файлы сразу большой кучей...
--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 23.7.2003, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Уже же все сказали. Используй библиотеки(статические или динамические). У Builder неплохой эквивалент: package. И надо понимать, что в С++ нет понятия проекта и говорить о включении cpp куда либо бесмысленно. Проект - это термин используемых сред разработки а не языка. Поэтому о включении cpp ничего и не говорится. Не так давно, чтобы собрать программу приходилось компилить каждый cpp отдельно командной строкой, а затем полученные файлы obj линковать в приложение.
Если так уж в лом, то при аккуратном оформленнии cpp попробуй использовать тот же include. Вставь в проект отдельный чистый cpp, в котором будут только include

#include "file1.cpp"
#include "file2.cpp"
#include "file3.cpp"
#include "file5.cpp"




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
DENNN
Дата 23.7.2003, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Я не спец по билдеру, по этому скажу про VC после подключения h-файла производиться поиск сначала среди подключенных в проект файлах *.cpp, а если там такого файла нет, то просматриваються все каталоги указаные в свойствах среды разработки как каталоги с Source-файлами. Тоже самое происходит и при включении заголовочного файла, только опция будет не "Source files", а "Include Files".
По этому, копирпуешь свои cpp файлы в отдельную директорию, заголовочные файлы в отдельную, прописываешь пути (или можешь накидать все в кучу в одну из уже прописанных стнадартных) и все у тебя будет хорошо.

После этого можешь просто добавлять в файле строчку #include..... Не правдали так намного удобнее и главное вернее?
А велосипед изобретать не надо smile.gif


P.S. Тебя не удивляло, что вставка строки вида #include stdio.h не вызывает у компилятора шок? Ты же не думаешь что все стандартные библиотеки состоят только из заголовочных файлов?
PM ICQ   Вверх
RAN
Дата 23.7.2003, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



DENNN, нет, так не получится. В VC надо свой lib добавить в свойствах проекта, по-моему на вкладке Link перечислены kernel32.lib и т.п. Так вот в конце дописываешь свой и он добовляется в командную строку компановщика. Но мне кажется лучше lib включать в проект.
А в Buildere такого нет, там можно только подключить файл к проекту.
PM MAIL ICQ   Вверх
Vyacheslav
Дата 23.7.2003, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(RAN @ 23.7.2003, 11:31)
А в Buildere такого нет, там можно только подключить файл к проекту.

Опять Builder обижают sad.gif . Поясни, чего там у него нет


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
RAN
Дата 23.7.2003, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я не обижаю Builder, я с ним не меньше Visual'a работаю. Это факт:
В VC можно изменять список стандартных lib файлов или вообще отключить и писать с нуля, только точка входа будет не main и не WinMain, а mainCRTStartup. Входишь в setting... проекта (Alt+F7) и там на странице Link в категории General есть EditBox "Object/Library modules" перечислены lib по-умолчанию, можешь редактировать и добавлять свои. А если там отметить Ignore all default libraries, то в проект не будут подключаться никакие lib и компанивщик не сможет найти даже mainCRTStartup, с которого начинается выполнение программы. А в Builder'e список стандартных библиотек не изменить.
PM MAIL ICQ   Вверх
Vyacheslav
Дата 23.7.2003, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Мда !? biggrin.gif
В каталоге Bin открываем Notepad'ом файл с именем default.bpr и правим
Цитата

  <LINKER>
    <ALLOBJ value="c0w32.obj $(PACKAGES) Memmgr.Lib sysinit.obj $(OBJFILES)"/>
    <ALLRES value="$(RESFILES)"/>
    <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib gfgfgfg.lib"/>
    <OTHERFILES value=""/>
  </LINKER>


Потом создаем новый проект, транслируем и получаем smile.gif
Цитата

[Linker Fatal Error] Fatal: Unable to open file 'GFGFGFG.LIB'


Кстати для Builder6 правим секцию
Цитата

<FILELIST>
      <FILE FILENAME="%0:s.res" FORMNAME="" UNITNAME="" CONTAINERID="ResTool" DESIGNCLASS="" LOCALCOMMAND=""/>
      <FILE FILENAME="ULoginDialog.cpp" FORMNAME="LoginDialog" UNITNAME="ULoginDialog" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
</FILELIST>


и у нас при создании при создании проекта сразу подключается и *.cpp-файл


Я уж не говорю о возможности написания визардов для создания проектов.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
HexoGenus
Дата 23.7.2003, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



DENNN уже пробовал sad.gif
и на всякий случай попробовал еще раз...
скопировал свои файлы почти во все папки билдера, в опциях билдера везде где только можно дописал к путям ;$(BCB)\include\my
в VС может и ищутся cpp файлы, а билдер обрабатывает только те что подключены к проекту...

Vyacheslav почитай внимательно то что писалось выше sad.gif
include будет работать только при подключении к одной форме если попробуешь использовать include на нескольких формах то этот способ не прокатит...
твой способ прописать cpp файлы радует тем что это можно сделать один раз для всех вновь создаваемых проектов... опробуем, поделимся впечатлениями smile.gif


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


Опытный
**


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

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



Vyacheslav, если так, то значит можно. Прошу прощения за свою неосведомлённость. smile.gif
HexoGenus, почитай повнимательней всё, что в этой теме писалось. По моему исчерповающее обсуждение. Тут есть масса вариантов.
И насчёт #include: я не говорил, что их нельзя на разные формы лепить, я сказал, что твой h-файл не верно составлен. Нельзя в нём функции реализовывать и переменные определять.

Это сообщение отредактировал(а) RAN - 23.7.2003, 22:33
PM MAIL ICQ   Вверх
Vyacheslav
Дата 24.7.2003, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



HexoGenus
При правильном оформлени h-файла его спокойно можно цеплять к всем формам проекта. Спорить с этим бесполезно. Открой h-файл любой формы и увидишь обязательно #include <vcl.h>
RAN
Цитата

Нельзя в нём функции реализовывать и переменные определять.

Небольшая поправочка: в общем случае ты прав, но в частности... не совсем. smile.gifЧто касается переменных: расширения С++Builder (а на именно его использует HexoGenus) позволяют объявлять и определять переменные в h-файлах
Код

//объявляем и определяем переменную
__declspec(selectany) int gX = 10;
//объявляем и определяем котстанту
extern const __declspec(selectany) AnsiString cStr = "abcd";


Что же касается функций, то inline-функциям место как раз в h-файлах




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
HexoGenus
Дата 25.7.2003, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хмммм.... сложно вести обсуждение когда приходится каждый раз повторять одно и тоже в полном и неизменном виде... уточню свою фразу:

Нельзя подключить *.cpp файл при помощи команды include к нескольким формам сразу... и как вы его не оформите это верно для билдера на 100%

А для одной формы работает вполне...
И проблему я поднял как раз подключения cpp файлов а не h

inline и extern функции меня в данном случае не интересуют...

Самое красивое из того что было предложено это lib файлы ...

И пока что я пришел к выводу что фирма борланд нас прокатила...
потому что раньше в borland c++ для dos я через include прекрасно мог подключить свои cpp файлы а теперь немогу...
Подключение cpp файлов через менеджер проекта это извращение sad.gif
а другого способа нет...
К тому же в визуале как нам уже сказали компилятор сам ищет cpp файлы по указанным в опциях проекта папкам... кто мешал сделать то же самое фирме borland???

Кстати я так понимаю Борланд взамен предлагает создание своих невизуальных компонентов (что то никто этот вариант не предложил)
но настолько переходить от клавиатуры к мышке мне что то неохота...

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


Опытный
**


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

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



HexoGenus, прежде чем такое писать (я про предыдущий топик), разберись хорошенько во всём и прочти всё, что тебе тут писали, а не путай людей (особенно новичков).
Во-первых, в языке ничего не изменилось. И cpp никогда нельзя было подключать несколько раз, их вообще не принято подключать. А тебе предлагалось подключить их один раз в одном месте. Лучше их подключать в главном файле приложения, где Run метод вызывается (если ты о таком файле слышал).
Во-вторых, пользоваться менеджером - это не извращение. Не утверждай то, что является всего-лишь твоим мнением. Я, например, VCL в C++ не люблю использовать, это для Delphi, но никогда не позволял себе говорить, что использование VCL - изврат.
В-третьих, VC ничего сам не ишет (сам проверил), и выше я об этом писал, просто ты сам невнимательно читаешь.

Цитата
И пока что я пришел к выводу что фирма борланд нас прокатила...

Если Borland и кидала когда-то (например, прикратила развитие OWL), то в данном контексте такое заявление не обосновано.

PM MAIL ICQ   Вверх
HexoGenus
Дата 27.7.2003, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
Лучше их подключать в главном файле приложения, где Run

Хмммм ... не только слышал но даже и использую при написании приложений которые нужно скрыть от пользователя...

Собрался уж было возмущаться по этому поводу, но обычно перед тем как утверждать нужно попробовать...

Попробовал и заработало!

Оказывается если к главному модулю подключить при помощи include *.h файл то это нисколько не повлияет на видимость функций описанных в этом h файле на других формах (даже если подключить соответствующий cpp файл через менеджер проекта) а вот если подключить к главному модулю cpp файл а потом на нужных формах подключать h файл с описанием функций то все работает...

Так что теперь можно поступать так:
создаем свой каталог для *.cpp файлов (к примеру этот же каталог у нас будет содержать *.h файлы)
Подключаем этот каталог к билдеру в опциях в строке
Options->Project->Directories...->Include path
дописываем: ;$(BCB)\include\my
(не забыть поставить птичку в Default)

создаем там главный файл включающий список всех своих *.cpp файлов

MyFunction.cpp

#include "MyMath.cpp";
#include "MyGraph.cpp";
#include "MyMessage.cpp";

потом подключаем этот файл к главному модулю проекта

Project1.cpp
#include "MyFunction.cpp";

После этого на любой форме мы можем подключить свой *.h файл

Unit1.cpp
#include "MyMath.h";

И все работает!

ОГРОМНОЕ ВСЕМ ВАМ СПАСИБО !!!

PS И все равно пользоваться менеджером для подключения не нескольких, а большого количества файлов к каждому своему проекту это извращение tounge.gif

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


3D-маньяк
****


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

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



Народ, а никто не пробовал
Код
#pragma once
?

Говорят, помогает smile.gif


--------------------
user posted image
PM MAIL WWW   Вверх
Страницы: (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.0829 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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