Директивы препроцессора. Выполнение действий перед компиляцией

Материал из ТХАБ.РФ
Версия от 12:35, 8 августа 2021; Админ (обсуждение | вклад) (Директива #Область)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Прежде, чем код программы будет откомпилирован, можно произвести с ним определенные манипуляции или указать компилятору, что и как необходимо делать.

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

Текст программы предназначен для компилятора, однако, прежде, чем компилятор приступит к компиляции, в дело вступает препроцессор, который выполняет с текстом программы подготовительные операции и настраивает компилятор. Язык программирования Перфолента.Net предусматривает размещение в тексте программы специальных команд препроцессора, называемых директивами.


Содержание

Директивы препроцессора.

Строка текста, начинающаяся с символа # (решётка), является директивой препроцессора. Директивы препроцессора выполняются до передачи текста программы компилятору.

Директивы препроцессора делятся на несколько групп:

1) Директивы редактора исходного текста. При компиляции игнорируются

  • Область

2) Директивы настройки компилятора

  • АвторскоеПраво
  • ВерсияПродукта
  • ВерсияСборки
  • ИспользоватьСтандартнуюБиблиотеку
  • Зависимость
  • ЗагрузитьСборку
  • ЗапретитьПозднееСвязывание
  • ЗначокСборки
  • Компания
  • НазваниеПродукта
  • ОписаниеПродукта
  • Ресурс
  • РесурсСборки
  • СвязанныйФайл
  • СтрогаяПроверкаТипов
  • ТипСборки
  • ТорговаяМарка
  • ТребоватьОбъявлениеПеременных
  • ЦелевойПроцессор

3) Директивы подготовки исходного кода программы

  • ВключитьФайл
  • Если
  • Перем
  • ПространствоИмен
  • ТипЧислаПоУмолчанию

Директивы редактора исходного текста

Директива #Область

Блочная директива препроцессора #Область используется редактором кода (а не компилятором при сборке программы!) для выделения, а также, сворачивания/разворачивания отдельных блоков кода, что очень удобно для компоновки и обзора исходного текста и навигации по нему.

Имя области может быть задано либо строкой, либо идентификатором.

#Область "Имя области" //имя области задано строкой
       //... какой-то блок кода и комментарии к нему...
#КонецОбласти
#Область ИмяОбласти //имя области задано идентификатором
       #Область ИмяВложеннойОбласти
               //Области могут быть вложены друг в друга!
       #КонецОбласти
#КонецОбласти

Конструкторы кода могут использовать директиву #Область для обрамления кода, построенного конструктором.

Конструктору могут так же передаваться некоторые параметры. Синтаксис передачи параметров совпадает с синтаксисом установки значений свойств объекта с помощью инициализатора. Синтаксис директивы #Область при использовании конструктора выглядит так:

#Область ИмяКонструктора{ .ИмяПараметра1 = ЗначениеПараметра1, .ИмяПараметраН = ЗначениеПараметраН } //имя области 
заменено на имя конструктора
//тут располагается код сформированный конструктором
#КонецОбласти

Директивы настройки компилятора

Директива #ИспользоватьСтандартнуюБиблиотеку.

Директива препроцессора #ИспользоватьСтандартнуюБиблиотеку подключает к программе библиотеку объектов, поставляемую с компилятором.

При компиляции происходит загрузка сборки Perfolenta_LibMain.dll и импорт имен в пространстве имен Промкод.Перфолента.

При компиляции библиотека копируется в папку выходного файла, если её ещё там нет.

Пример:

#ИспользоватьСтандартнуюБиблиотеку

Директива #ТипСборки

Директива #ТипСборки определяет тип файла сборки получаемого после компиляции. Ниже указаны возможные варианты этой директивы:

-Консольное приложение (тип сборки по умолчанию). Файл EXE. Вывод идет в окно консоли. Точка входа – процедура Старт в модуле Программа.

  1. ТипСборки КонсольноеПриложение

-Оконное приложение. Файл EXE. Окно консоли не открывается. Точка входа – процедура Старт в модуле Программа.

  1. ТипСборки ОконноеПриложение

-Библиотека типов. Файл DLL. Точка входа отсутствует. Процедура Старт не вызывается даже если присутствует в модуле Программа.

  1. ТипСборки Библиотека

Директива #ЦелевойПроцессор

Директива #ЦелевойПроцессор определяет тип процессора, на котором будет работать сборка после компиляции. Ниже указаны возможные варианты этой директивы:

-Любой (по умолчанию) - программа сможет запускаться на любом поддерживаемом типе процессора.

#ЦелевойПроцессор Любой

-Х32 - программа сможет запускаться либо на 32-х разрядном процессоре, либо в 32-х разрядном режиме, если это возможно на текущем процессоре.

#ЦелевойПроцессор Х32

-Х64 - программа сможет запускаться только на 64-х разрядном процессоре.

#ЦелевойПроцессор Х64

-IA64 - программа сможет запускаться только на 64-х разрядном процессоре архитектуры Intel Itanium.

#ЦелевойПроцессор IA64

-ПредпочитатьХ32 – если возможно, программа будет запускаться в 32-х разрядном режиме.

#ЦелевойПроцессор ПредпочитатьХ32

Директива #ПространствоИмен

Директива #ПространствоИмен позволяет задать корневое пространство имен для всех определенных в программе типов. Если у типа будет задано собственное пространство имен, то оно будет так же находиться в корневом пространстве имен. Например, если задано корневое пространство имен «Система», а классу задано пространство имен «Раздел1», то класс будет находится в пространстве имен «Система.Раздел1».

#ПространствоИмен "МояКомпания.МойПроект"

Директива #ЗагрузитьСборку

Директива #ЗагрузитьСборку используется для загрузки используемых в программе внешних сборок NET. Можно выделить три варианта директивы:

  • из папки текущего файла программы
#ЗагрузитьСборку "SmallBasicLibrary.dll"
  • из указанной папки
#ЗагрузитьСборку "C:\Program Files (x86)\Microsoft\Small Basic\SmallBasicLibrary.dll"
  • по полному имени сборки из GAC или папки компилятора
#ЗагрузитьСборку "SmallBasicLibrary, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
#ЗагрузитьСборку "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

Директива #ТипЧислаПоУмолчанию

Директива препроцессора #ТипЧислаПоУмолчанию может задать тип для числовых литералов, у которых не указан спецификатор типа. Эта возможность может использоваться в случае финансовых или инженерных расчетов, в которых есть много математических выражений. В обычных программах, где мало математических выражений, лучше НЕ использовать эту директиву, а использовать спецификаторы литералов и правила назначения типов чисел по умолчанию.

Примеры:

#ТипЧислаПоУмолчанию "Число" //для финансовых расчетов
#ТипЧислаПоУмолчанию "ДВещ" //для инженерных расчетов

В следующем примере надо указывать полный квалификатор типа, т.к. импорт имён не действует в препроцессоре:

#ТипЧислаПоУмолчанию "Microsoft.SmallBasic.Library.Primitive" //для работы со сторонним типом чисел

Директива #Перем. Переменные препроцессора и их значения

Переменные, значения которых будут проверяться препроцессором в директивах условной компиляции, задаются директивой #Перем.

#Перем ИмяПеременной=ЗначениеПеременной

Имя переменной задается по общим правилам для имен.

Значение переменной — это просто литерал одного из трех типов Булево, Целое, Строка. Ни каких вычислений препроцессор не производит.

Примеры:

#Перем ВключитьСообщения=Истина
#Перем НомерБлока=2
#Перем Отладка="Второй блок"
#Перем ДемоВерсия = Ложь

Директива #Если. Компиляция по условию

Директива #Если используется в тех случаях, когда необходимо компилировать или не компилировать блок кода в зависимости от значений переменных, определенных директивой #Перем. Директивы #Если могут быть вложенными друг в друга, но не могут пересекаться.

Грамматическая форма директивы состоит из обязательной секции #Если, повторяющихся или отсутствующих секций #ИначеЕсли и имеющейся или отсутствующей секции #Иначе:

#Если ИмяПеременной = ЗначениеПеременной [Тогда]
           //блок кода…
[#ИначеЕсли ИмяПеременной = ЗначениеПеременной [Тогда]]
           //блок кода…
[#Иначе]
           //блок кода…
#КонецЕсли

В квадратных скобках указаны необязательные фрагменты директивы.

Откомпилируется и попадет в сборку тот блок кода, который находится под секцией, условие которой выполнилось первым. Если ни одно из условий в имеющихся условных секциях не выполнилось, и при этом имеется секция #Иначе, то будет откомпилирован блок кода из секции #Иначе. Если секция #Иначе отсутствует, и ни одно из условий в условных секциях не выполнилось, то ни один из блоков кода откомпилирован не будет.

Пример:

#Если Отладка=Истина //ключевое слово Тогда не обязательно
           ВыводСтроки "Отладка=Истина"
#ИначеЕсли Отладка=Ложь Тогда //комментарий
           ВыводСтроки "Отладка=Ложь"
#ИначеЕсли Отладка="Второй блок" Тогда
           ВыводСтроки "Отладка=""Второй блок"""
           //проверим вложенный блок директив
           #Если НомерБлока=1
               ВыводСтроки "Вложенный блок: НомерБлока=1"
           #ИначеЕсли Демо=Ложь Тогда
               ВыводСтроки "Вложенный блок: Демо=Ложь"
           //тут будет ошибка "Переменная Ошибка не определена", если раскомментировать этот блок
           //#ИначеЕсли Ошибка=Ложь Тогда
           //    ВыводСтроки "Вложенный блок: Ошибка=Ложь"
           #Иначе
               ВыводСтроки "Вложенный блок: Отладка=Нечто"
           #КонецЕсли
#Иначе
       ВыводСтроки "Отладка=Нечто"
#КонецЕсли

Директивы подготовки исходного кода программы

Директива #ВключитьФайл

Директива #ВключитьФайл позволяет собрать во время компиляции полный исходный текст программы из включаемых файлов. Текст из включаемого файла будет вставлен в место нахождения директивы. Включаемые файлы в свою очередь также могут иметь включаемые файлы, однако необходимо избегать зацикливания. Путь к включаемому файлу может быть абсолютным или относительным. Желательно, чтобы файлы, которые проектируются как включаемые в разные проекты (так называемые "сниппеты"), имели уникальные имена переменных, констант, процедур и т.д. или имели собственное пространство имен в случае включения на уровне классов.

Примеры:

//Из произвольного каталога
#ВключитьФайл "C:\КаталогВключаемыхФайлов\ВключаемыйФайл1.пфлвкл"
//Из того же каталога, что и основной файл программы
#ВключитьФайл "ВключаемыйФайл2.пфлвкл"

Директива #СвязанныйФайл

Директива #СвязанныйФайл позволяет указать файл, который не является частью программы, но является необходимым для её сборки, модификации, проверки, тестирования или в других целях. Директива #СвязанныйФайл может использоваться для сохранения или обработки связанных файлов инструментами автоматизации разработки, например, архиватор проектов должен включить такие файлы в архив, а конструктор класса может сохранять в связанном файле свои настройки.

Примеры:

//Из произвольного каталога
#СвязанныйФайл "C:\МойПроект\СвязанныеФайлы\НастройкиАрхивации.арх"
//Из того же каталога, что и основной файл программы
#СвязанныйФайл "НастройкиКонструктораКласса.опт"

Директива #Зависимость

Директива #Зависимость позволяет указать файл или каталог с файлами, который будет необходим программе во время выполнения. Компилятор скопирует такой файл или каталог в каталог создаваемой сборки.

Примеры:

//Из произвольного каталога
#Зависимость "C:\МойПроект\Разное\ФайлДанных.дат"
//Из того же каталога, что и основной файл программы
#Зависимость "НачальныеНастройкиПрограммы.опт"

Директива #СтрогаяПроверкаТипов

Директива #СтрогаяПроверкаТипов предназначена для включения режима строгой проверки типов. При строгой проверке типов запрещаются неявные преобразования, сужающие тип. Например, Вы сможете присвоить значение типа Байт переменной типа Целое, но обратное преобразование вызовет ошибку компиляции.

Примеры:

#СтрогаяПроверкаТипов

Директива #ЗапретитьПозднееСвязывание

Директива #ЗапретитьПозднееСвязывание запрещает использование свойств и методов типа, которые невозможно идентифицировать во время компиляции. Обычно такая ситуация случается, когда доступ к свойствам и методам происходит через переменную типа Объект.

Позднее связывание выполняется во время выполнения программы и поэтому вызов метода или обращение к свойству объекта происходит значительно медленнее, чем при раннем связывании во время компиляции. Если позднее связывание используется внутри цикла, то снижение производительности программы может быть очень значительным.

Примеры:

#ЗапретитьПозднееСвязывание

Директива #ТребоватьОбъявлениеПеременных

Директива #ТребоватьОбъявлениеПеременных запрещает неявное создание переменных без объявления. Неявное объявление переменной может привести к тому, что её тип будет отличаться от необходимого, а так же ухудшает беглое чтение текста программы.

Пример:

#ТребоватьОбъявлениеПеременных

Директива #РесурсСборки

Директива #РесурсСборки позволяет во время компиляции интегрировать в исполняемый файл программы файл ресурсов в формате RES. Обычно в этом файле находится значок программы и информация о сборке, но могут находиться и другие данные. Если задан файл ресурсов сборки, то нельзя использовать другие директивы внедрения информации о сборке, т.к. вся эта информация уже должна быть в файле ресурсов.

Примеры:

//Из произвольного каталога
#РесурсСборки "C:\МойПроект\Ресурсы\РесурсыМоейСборки.res"
//Из того же каталога, что и основной файл программы
#РесурсСборки "РесурсыМоейСборки.res"

Директива #Ресурс

Директива #Ресурс позволяет во время компиляции интегрировать в исполняемый файл программы файл ресурсов в форматах RESOURCES или RESX, или любой другой файл данных, который может понадобиться во время выполнения программы. Это могут быть файлы картинок, звуковые или видеофайлы, как и любые другие. Во время выполнения можно получить эти файлы с помощью оператора ПолучитьРесурс.

Примеры:

//Из произвольного каталога
#Ресурс "C:\МойПроект\Ресурсы\РесурсыМоейФормы.resources"
//Из того же каталога, что и основной файл программы
#Ресурс "ТаблицаИсходныхДанных.xlsx"
#Ресурс "МояКартинка.jpg"
// и где-то в методе программы получим эти файлы….
ТаблицаИсходныхДанных = Новый ДвоичныеДанные(ПолучитьРесурс("ТаблицаИсходныхДанных.xlsx"))
МояКартинка = Новый Картинка(ПолучитьРесурс("МояКартинка.jpg"))

Директивы информации о сборке

Формат EXE файлов подразумевает возможность добавить информацию о программе в виде специальных ресурсов. Для облегчения задания этой информации в языке Перфолента имеются специальные директивы препроцессора.

Обратите внимание, что если Вы уже использовали директиву #РесурсСборки, то указанные в этом пункте директивы информации о сборке использовать нельзя.

Примеры:

#ЗначокСборки "MyIcon.ico"
#ВерсияСборки "1.0.0.0"
#НазваниеПродукта "Моя программа"
#ОписаниеПродукта "Самая лучшая программа в мире."
#ВерсияПродукта "1.0.0.0"
#Компания "ООО Рога и Копыта"
#АвторскоеПраво "Остап Бендер, 1927"
#ТорговаяМарка "Бендер ТМ"

Вывод: Директивы препроцессора позволяют сделать дополнительную разметку кода, настроить компилятор или подготовить исходный код программы к компиляции.


'Показать Содержание Описание языка Перфолента.NET'

Ссылки