sau |
Отправлено: 01.03.2004, 17:50 |
|
Не зарегистрирован
|
Есть несколько самодостаточных функций, которые надо обособить
в отдельном модуле с возможностью вызывать из любого места
проекта.
Я сохранил их отдельно в UniFunc.cpp/h и добавил к проекту.
Сам модуль UniFunc.cpp компилируется без ошибок.
А вот при компиляции всего проекта вылазит ошибка насчет
вызова необъявленной функции (той, что в отдельном модуле теперь).
Как вообще цеплять отдельные модули в другие модули?
Надо ли как-то особым образом объявлять глобальные функции?
Пробовал дописывать руками в Main.cpp
#include "UniFunc.h"
и
USEUNIT(UniFunc.cpp);
- не помогло :-(
Подскажите, пожалуйста, кто знает. А то билдеровский хэлп весьма
скуп на концептуальные объяснения — это не Access 97, а готовый
ответ в Интернете нарыть не удалось. |
|
Riedle |
Отправлено: 01.03.2004, 18:38 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 9
|
Привет!
Я выносил так! Не надо добавлять этот файл в проекты UniFunc.cpp/h. Просто в Main.cpp (точнее в Main.h) подключит этот файл #include "UniFunc.h". Это ты правильно сделал.
Отредактировано Riedle — 01/03/2004, 19:41 |
|
sau |
Отправлено: 02.03.2004, 07:39 |
|
Не зарегистрирован
|
>>Riedle: Не канает у меня так, говорю ж :-(
Убрал UniFunc.cpp из проекта, добавил в Main.h строку
#include "UniFunc.h"////
Компилирую:
[C++ Error] Main.cpp(100): E2268 Call to undefined function 'CaptureConsoleOutput'
Опять 25...
Может дописывать в UniFunc.h что-то надо сверх того, что
билдер туда при создании модуля написал?
Может надо хитро декларировать входящие в UniFunc.cpp функции?
У меня они там по-простецки описаны, типа:
AnsiString CaptureConsoleOutput(AnsiString CommandLine)
{
...
}
public втыкал перед функцией — без толку. Из Main.cpp все равно "не
видно". |
|
Gedeon |
Отправлено: 02.03.2004, 09:40 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Странно не должно такого быть.
Давайте по порядку:
1) Создаем юнит.
2) Project->AddToProject (Shift+F11) Ваш юнит
3) File->IncludeUnitHdr (Alt+F11) Хидер вашего юнита.
И что так тоже вылетает ошибка?
QUOTE |
public втыкал перед функцией — без толку. Из Main.cpp все равно "не
видно". |
Если эти функции сами по себе, т.е. не члены класса, то не надо там Public. Абсолютно такие же действия сделал у себя Все работает без единого писка.
Отредактировано Gedeon — 02/03/2004, 10:45
|
|
sau |
Отправлено: 02.03.2004, 10:10 |
|
Не зарегистрирован
|
Всем спасибо, вопрос закрыт, я допер в чем грабли были
Оказывается, следовало
#include
добавить в начало модуля UniFunc.cpp (при создании
модуля автоматически не добавляется).
Полностью начало UniFunc.cpp вот так будет:
#include
#include "PubFuncs.h"
#pragma hdrstop
#pragma package(smart_init)
В UniFunc.h никаких шевелений сверх билдером созданных
#ifndef PubFuncsH
#define PubFuncsH
#endif
не надо (то есть может и надо, но в данном случае не обязательно).
Затем в Main.cpp, где юзаются функции из UniFunc.cpp
после
#pragma resource "*.dfm"
воткнул
#include "UniFunc.cpp"////
и заработало.
|
|
sau |
Отправлено: 02.03.2004, 10:13 |
|
Не зарегистрирован
|
Это повтор, угловые скобки не прорисовались,
заменил на кавычки "vcl.h".
Всем спасибо, вопрос закрыт, я допер в чем грабли были
Оказывается, следовало
#include "vcl.h"
добавить в начало модуля UniFunc.cpp (при создании
модуля автоматически не добавляется).
Полностью начало UniFunc.cpp вот так будет:
#include "vcl.h"
#include "PubFuncs.h"
#pragma hdrstop
#pragma package(smart_init)
В UniFunc.h никаких шевелений сверх билдером созданных
#ifndef PubFuncsH
#define PubFuncsH
#endif
не надо (то есть может и надо, но в данном случае не обязательно).
Затем в Main.cpp, где юзаются функции из UniFunc.cpp
после
#pragma resource "*.dfm"
воткнул
#include "UniFunc.cpp"////
и заработало.
|
|
Gedeon |
Отправлено: 02.03.2004, 10:38 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (sau @ 02/03/2004, 11:15) | Затем в Main.cpp, где юзаются функции из UniFunc.cpp
после
#pragma resource "*.dfm"
воткнул
#include "UniFunc.cpp"////
и заработало. |
Это неправильно, должен быть include именно h файл.
|
|
sau |
Отправлено: 02.03.2004, 10:52 |
|
Не зарегистрирован
|
>>Gedeon:
Наверное, ты прав...
Попробовал по-твоему — вроде заработало
(vcl.h не хватало в UniFunc.h).
А почему #include UniFunc.h правильнее?
Как правильно объявлять функции в UniFunc.h?
Я просто скопировал объявление из UniFunc.cpp
AnsiString CaptureConsoleOutput(AnsiString CommandLine);
(только с точку с запятой добавил) и воткнул перед
#endif
Может по уму надо всякие закидоны типа extern использовать?
|
|
Gedeon |
Отправлено: 02.03.2004, 13:16 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
VCL не хватало т.к. используется класс AnsiString.
Про структуру файлов в ВСВ почитай тут
http://www.cbuilder.ru/Stat/elm_sfile/sfile.htm
QUOTE | Category
Storage class specifiers
Syntax
extern ;
[extern] ;
Description
Use the extern modifier to indicate that the actual storage and initial value of a variable, or body of a function, is defined in a separate source code module. Functions declared with extern are visible throughout all source files in a program, unless you redefine the function as static.
The keyword extern is optional for a function prototype.
Use extern "c" to prevent function names from being mangled in C++ programs. |
|
|
sau |
Отправлено: 02.03.2004, 13:41 |
|
Не зарегистрирован
|
>>Gedeon:
Благодарю, вот такая популярная статейка мне и нужна была
всю дорогу. |
|
olegenty |
Отправлено: 02.03.2004, 18:25 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
Ещё вариант, правда более сложный, но удобный: вынести сплош используемые функции в отдельный Runtime Package, прописать пути по умолчанию и забыть о них )). (и функциях, и путях. оч. удобно)
|
|
Георгий |
Отправлено: 02.03.2004, 21:53 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
ВЫ меня извините, но я не мог не вмешаться.
Пример программы состоящей из 2х файлов.
main.cpp
CODE |
#include "second.h"
int main(int ArgC, char* ArgV[], Char* Env[])
{
second_function();
};
|
second.h
CODE |
#ifndef SECOND_H_INCLUDED
#define SECOND_H_INCLUDED
void second_function(void);
#endif |
second.cpp
CODE |
#include "second.h"
#include <stdio.h>
void second_function(void);
{
printf("second_function called\n");
};
|
надеюсь, что после этого примера мне на глаза, хоть некоторое время, не будут попадаться строки вида:QUOTE | воткнул
#include "UniFunc.cpp"////
и заработало. | |
|