C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как вынести общие функции в отдельный модуль?, Окультуривание исходника.
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


Не зарегистрирован







Всем спасибо, вопрос закрыт, я допер в чем грабли были biggrin.gif
Оказывается, следовало
#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".
Всем спасибо, вопрос закрыт, я допер в чем грабли были biggrin.gif
Оказывается, следовало
#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:
Благодарю, вот такая популярная статейка мне и нужна была
всю дорогу. smile.gif
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"////
и заработало.

Вернуться в Вопросы программирования в C++Builder