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

 
Помогите разобраться, #include <заголовочный файл>
Антон
Отправлено: 09.11.2005, 11:35


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







В процессе обучения, у меня возник вопрос.
Строка процессора #include <> вызывает набор функций из заголовочных файлов (, ,, , и т. п.)
В книгах, как правило, пишут про определенные функции. А где можно посмотреть полный набор функций входящий в заголовочный файл? Или это мне потребуется. Это как пример. Есть куча других штуковин, подобным заголовочным файлов.
Guest
Отправлено: 09.11.2005, 12:20


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







Да ни чего include не вызывает, а вставляет при компиляции содержимое указанного файла в это место так как если бы это содержимое было написано прямо тут.
AntonGib
Отправлено: 09.11.2005, 12:37


Ученик-кочегар

Группа: Участник
Сообщений: 25



К словам не надо придераться, Я могу привести цитату из книги... ,но это не главное, я к чему все веду. Я хочу понять, какие функции входят (написаны) в заголовочных файлах, а что писать самому. Зачем делать двойную работу, если большая часть уже есть.
Valdemar
Отправлено: 09.11.2005, 13:10


Мастер участка

Группа: Участник
Сообщений: 433



Антон, вы найдите справочник по функциям С/С++ и посмотрите в нем какие функции есть. Так же есть различные библиотеки, например, STL, в которых много чего реализовано. Поищите нужные вам функции в help.
Gedeon
Отправлено: 09.11.2005, 13:25


Ветеран

Группа: Модератор
Сообщений: 1742



Читай книги по С++ польше в жизни не поможет ничего!
AntonGib
Отправлено: 09.11.2005, 14:36


Ученик-кочегар

Группа: Участник
Сообщений: 25



Огромное спасибо.
Если я правильно понял в одном определенном месте я не найду.
Я в HELP (е) пробовал по имени файал искать (пример: stdio.h), но все бесполезно. Искать функции нет смысла, я же не знаю что именно входит в файл. Как быть?
AVC
Отправлено: 09.11.2005, 14:57


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (AntonGib @ 09/11/2005, 13:36)
Как быть?

Вам отвитили. Резюме подвел Gedeon
Страуструп:
QUOTE

1.3.6  Модули

   Программа С++ почти всегда состоит из нескольких раздельно
транслируемых "модулей". Каждый "модуль" обычно называется исходным
файлом, но иногда — единицей трансляции. Он состоит из последовательности
описаний типов, функций, переменных и констант. Описание extern позволяет
из одного исходного файла ссылаться на функцию или объект, определенные в
другом исходном файле. Например:

          extern "C" double sqrt ( double );
          extern ostream cout;

   Самый распространенный способ обеспечить согласованность описаний
внешних во всех исходных файлах — поместить такие описания в специальные
файлы, называемые заголовочными. Заголовочные файлы можно включать во все
исходные файлы, в которых требуются описания внешних. Например, описание
функции sqrt хранится в заголовочном файле стандартных математических
функций с именем math.h, поэтому, если нужно извлечь квадратный корень из
4, можно написать:

           #include
           //...
           x = sqrt ( 4 );

   Поскольку стандартные заголовочные файлы могут включаться во многие
исходные файлы, в них нет описаний, дублирование которых могло бы вызвать
ошибки. Так, тело функции присутствует в таких файлах, если только это
функция-подстановка, а инициализаторы указаны только для констант ($$4.3).
Не считая таких случаев, заголовочный файл обычно служит хранилищем для
типов, он предоставляет интерфейс между раздельно транслируемыми частями
программы.

   В команде включения заключенное в угловые скобки имя файла (в нашем
примере — ) ссылается на файл, находящийся в стандартном каталоге
включаемых файлов. Часто это — каталог /usr/include/CC. Файлы, находящиеся
в других каталогах, обозначаются своими путевыми именами, взятыми в
кавычки. Поэтому в следующих командах:

         #include "math1.h"
         #include "/usr/bs/math2.h"

   включаются файл math1.h из текущего каталога пользователя и файл
math2.h из каталога /usr/bs.

   Приведем небольшой законченный пример, в котором строка определяется в
одном файле, а печатается в другом. В файле header.h определяются нужные
типы:

         // header.h

         extern char * prog_name;
         extern void f ();

   Файл main.c является основной программой:

         // main.c

         #include "header.h"
         char * prog_name = "примитивный, но законченный пример";
         int main ()
         {
           f ();
         }

   а строка печатается функцией из файла f.c:

         // f.c

         #include
         #include "header.h"
         void f ()
         {
           cout << prog_name << '\n';
         }

   При запуске транслятора С++ и передаче ему необходимых
файлов-параметров в различных реализациях могут использоваться разные
расширения имен для программ на С++. На машине автора трансляция и запуск
программы выглядит так:

         $ CC main.c f.c -o silly
         $ silly

           примитивный, но законченный пример

         $

   Кроме раздельной трансляции концепцию модульности в С++ поддерживают
классы ($$5.4).
AntonGib
Отправлено: 09.11.2005, 15:45


Ученик-кочегар

Группа: Участник
Сообщений: 25



Давайте с самого начала рассудим логически, если я про этого не читал (предположим), то каким образом я могу задать такой вопрос. Я понял к чему вы клоните, при написании программы ее можно разбить на несколько модулей. Но я спрашиваю про "стандартные", которые уже определены. Или я что-то не понимаю, или мне придется изучать С++ от самой старой версии до скажем Bulder 6 и прослеживать все изменения, т. е. постепенно смотреть наполнение файла скажем stdio.h, правильно я понял. Если это так то это полный тупизм.
AVC
Отправлено: 09.11.2005, 16:24


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Давайте с самого начала рассудим логически, если я про этого не читал (предположим), то каким образом я могу задать такой вопрос

Легко. Допустим в владеете каким либо алгоритмическим языком. Вам в руки попадает Builder любой версии. Вы выполняете команду "новое приложение", затем построить и все, работаетет. А уж бросить на форму пару визуальных компонент большого ума не надо.

QUOTE

при написании программы ее можно разбить на несколько модулей.

Не можно, а нужно. Это и происходит. Не будете же вы включать абсолютно все функции на уровне исходного текста. Основное правило — сделать один раз, использовать многократно.

QUOTE

Но я спрашиваю про "стандартные", которые уже определены.

Обычно заголовочные файлы накапливаются в $(BCB)\include $(BCB)\include\vcl
Помните "В команде включения заключенное в угловые скобки имя файла (в нашем примере — ) ссылается на файл, находящийся в стандартном каталоге включаемых файлов."

QUOTE

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

В самом заголовочном файле. Это, наряду с просмотров исходников, очень полезное и поучительное занятие.

QUOTE

постепенно смотреть наполнение файла скажем stdio.h

Ну это если вы интересуетесь истроией эволюции языка. Обычно смотрится та версия, с которой вы работаете.

Отредактировано AVC — 09/11/2005, 15:30
AntonGib
Отправлено: 09.11.2005, 17:10


Ученик-кочегар

Группа: Участник
Сообщений: 25



"В самом заголовочном файле. Это, наряду с просмотров исходников, очень полезное и поучительное занятие."

Но этот процесс очень трудоемкий. Файл получается как карточный дом, из одного файла получается следующий и т. д.

А вставлять визуальные компоненты, со своими свойствами и методами это я думую смудрит почти каждый.

Я изначально почему задал вопрос. Когда читаешь литерату, там как правило деламем так... бла, бла ... Это более менее понятно, но сверху шлепуются заголовочные файлы и подобные штуки и в одну или максимум в две строчки пишется (пример: корень — вызывается заголовочный файл math.h ), как зачем, почему?
Asher
Отправлено: 09.11.2005, 17:27


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Читал эту тему с утра регулярно.
Наконец, мне так кажется, понял.

Для этого существует справочная система.
Например тот-же квадратный корень.
Зовоте справку->закладка поиск->square...
смотрим варианты тем
после некоторого поиска и тыканья в другие разделы набредаем на
тему sqrt, sqrtl
читаем. А там указан требуемый для функции заголовочный файл.
Заодно замечаем раздел — Math Routines
Снова зовем справку
теперь закладку предметный указатель в строке поиска набираем Math Routines и попадаем в раздел где перечислены все матфункции.
и т.д. и т.п

Отредактировано Asher — 09/11/2005, 18:28
Boyko
Отправлено: 10.11.2005, 00:10


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (Антон @ 09/11/2005, 10:35)
А где можно посмотреть полный набор функций входящий в заголовочный файл?

Тоже читал регулярнол Но я понял так.

1. Окрываете заголовочный файл. Можно Notepad-ом, но лучше Builder-ом.

2. Читаете!

smile.gif
Вывод:
Полный набор функций входящий в заголовочный файл можно посмотреть в заголовочный файл.
biggrin.gif
Asher
Отправлено: 10.11.2005, 09:39


Мастер участка

Группа: Модератор
Сообщений: 550



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

А как узнать в какой заголовочный фал смотреть? wink.gif
biggrin.gif biggrin.gif biggrin.gif
AntonGib
Отправлено: 10.11.2005, 10:33


Ученик-кочегар

Группа: Участник
Сообщений: 25



Огромное спасибо всем, особенно Asher. Теперь понтихоньку все стало вставать на свои места.

Объясните пожалуйста человеским языком для чего нужно pragma ?

я понял так — это название прогрограмм (попрате меня если я не прав.)

Справка
#pragma defineonoption and #pragma undefineonoption

See also #pragma

Syntax

#pragma defineonoption name switch(es)
#pragma undefineonoption name switch(es)

Description

These two pragmas allow you to alias one or more command-line options to a name. You can use most of the command-line switches in the pragma except those which take input such as –I and –L.

The #pragma defineonoption defines name if all specified switch(es) are on at the time of the pragma. Similarly, the #pragma undefineonoption undefines name if all the switch(es) are on at the time of the pragma.

For example, myfile.c includes the following code:

#pragma defineonoption OPTIMIZING -O2

#ifdef OPTIMIZING

#pragma message We are optimizing with -O2

#else

#pragma message There are no optimizations turned on

#endif

When you compile with bcc32 -c myfile.c, the output is:

There are no optimizations turned on

Now compile with bcc32 -c -O2 myfile.c, and the output is:

We are optimizing with -O2

You can use more than one switch. For instance, consider the new myfile.c which demonstrates that you can undefine options:

#define SWITCHES_ARE_OFF
#pragma undefineonoption SWITCHES_ARE_OFF -O2 -c -P -C
#ifdef SWITCHES_ARE_OFF
#pragma message At least one of the switches is not turned on
#else
#pragma message All switches are turned on
#endif

Compile with bcc32 -c myfile.c, and the result is:

At least one of the switches is not turned on

Compile with bcc32 -c -P -O2 -C, and you'll see:

All switches are turned on

Or compile with bcc32 -P -c -C -O2 -v -f -H, and you'll see:

All switches are turned on

As you can see, the order of the switches is not important.

What not to do

You can only define or undefine one name, so the following syntax generates an error:

#pragma defineonoption DEF1 DEF2 -O2

You must use one name to define or undefine, and you must use at least one switch, so the following examples all generate errors:

#pragma defineonoption -O2
#pragma undefineonoption DEF1
#pragma defineonoption




Георгий
Отправлено: 11.11.2005, 00:58


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



из lingvo:
pragma прагма способ передачи управляющей информации компилятору

очень полезная, но стольже специфичная вещь.
лично я использовал её что б задавать выравнивание полей структур (pragma pack), выводить сообщения при трансляции (pragma message), на некоторых участках кода отключать предупреждения транслятора, прерывать трансляцию, например, если пользователь подключил C заголовок, а использует C++

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