Delphi World - Директива компилятора - INCLUDE
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Директива компилятора - INCLUDE

Оформил: DeeCo

Автор: Виктор Кода

В своей статье Пишем DirectX-движок я писал про проблему, возникающую в Object Pascal в связи с только явным подключением заголовочных файлов. Благодаря одному человеку, подсказавшему решение, для меня эта проблема в основом снята. Хочу поделиться решением.

Существует такая директива компилятора - {$INCLUDE filename} и её более короткий аналог {$I filename}. Раньше я недооценивал её значение, т. к. в чужих программах с помощью неё к коду программы подключались либо файлы с процедурами, либо списки ассемблерных команд. Выяснилось, что с помощью этой директивы можно подключать и ссылки на другие файлы программы. Поясню на примере.

В IDE Delphi 5 при создании нового проекта в интерфейсной секции автоматически формируется список uses такого вида:

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

Начинающие ещё не усматривают никакого подвоха в этом (как не замечал этого и я, когда только осваивал программирование), но постепенно с ростом программ список uses, помимо ссылок на стандартные файлы среды, начинает пополняться десятками собственных и грозит распухнуть до гигинтских размеров. Частично её можно решить, если весь код собрать в нескольких файлах, но это неудобно.

Выход один - можно создать отдельный файл - назовём его, например, vcl.pas. После этого модернизируем его так:
//------------------------------------------------------------------
//    Файл:     vcl.pas
//    Описание: Список ссылок на стандартные модули VCL
//------------------------------------------------------------------
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs

Замечу, здесь нет ошибки! Именно так, без всех зарезервированных слов языка, должен выглядеть этот файл. После Dialogs точка с запятой отсутствует.

Теперь в модуле Unit1.pas удаляем все ссылки и пишем:
uses
  Activex, // для наглядности
{$I vcl};
Т. к. расширение по умолчанию - *.pas, его можно не указывать. Что же произошло? Директивой {$i} мы указали компилятору подставить список ссылок в текст модуля Unit1.pas. Получилось
uses
  Activex,
  Windows,
  Messages,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs;
Если бы поставили запятую ранее, то получилось бы ,; - что недопустимо. Можно поставить точку с запятой в конце списка ссылок в файле vcl.pas, но тогда нельзя ставить этот символ после директивы. Просто уясните себе, что директива {$INCLUDE} подставляет в исходную программу блок строк из указанного файла, и код необходимо согласовать. Также необходимо помнить, что данный файл (vcl.pas) не должен быть подключен к проекту, другими словами, в файле проекта ссылка вроде
vcl in 'vcl.pas';
должна отсутствовать - иначе возникнет ошибка наподобие
[Error]vcl.pas(5): 'UNIT' expected but identifier 'Windows' found.

Данная директива не решает всех проблем, это ведь не аналог директивы #include из языка С. Например, С позволяет организовать видимость модулей на нескольких уровнях - например, если модуль B включает модуль С, то модуль А, подключив модуль В, получит в своё распоряжение также и данные из модуля С. В нашем случае это недоступно, однако часто это и не требуется. А вот сократить список uses в каждом файле проекта - это может быть полезно.

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования