Парадигмы программирования
3.6. Приложения
3.6.1. Приложение I. Формат "заголовочных частей" (файлов "*.h") языков Си/C++
В "заголовочные файлы" программ на языке Си/C++ пишется следующая информация:
- 01. Текст с описанием назначения заголовочного файла;
- 02. Конструкция для предотвращения повторного использования файла;
- 03. Другие заголовочные файлы, содержащие константы и объявления функций, используемых в данном файле. При этом должно быть исключено повторное объявление одних и тех же модулей в заголовочных файлах;
- 04. Вставка необходимых прагма операторов (директив компилятору);
- 05. Определение констант и макроподстановок;
- 06. Объявление структур, объединений и перечисляемых типов;
- 07. Объявление глобальных переменных;
- 08. Объявление функций.
Рассмотрим эти конструкции поподробнее:
Пункт 01 Текст с описанием назначения заголовочного файла
Представляет собой следующий шаблон:
/********************************************************** * * Файл <имя файла>.H * * НАЗНАЧЕНИЕ: * * ЗАВИСИМОСТИ: * * Copyright (R) * **********************************************************/
В нем обязательно нужно указать название файла, назначение констант, переменных, объявлений типов и функций, использованных в данном заголовочном файле. Это нужно сделать "коротко и ясно". Также желательно указать зависимости данного файла с другими заголовочными файлами, а также правообладателя программы (название организации, либо имя и псевдоним, и обязательно контактные данные). Это может потребоваться при внесении изменений в программу в целом и в этот заголовочный файл в частности.
Пункт 02 Конструкция для предотвращения повторного использования файла
Представляет собой следующий шаблон:
#ifndef __"имя файла"_H #define __"имя файла"_H … #endif /* Конец заголовочного файла */
Эта конструкция определяет переменную: " __"имя файла"_H ". Именно использование этой переменной в пункте 3 (вернее, проверка на ее существование) предотвращает повторную загрузку заголовочного файла из самого себя или другого заголовочного файла.
В конце описания заголовочного файла должно стоять подножие: #endif. Заметим, что использование этих конструкций и правила именования переменных является стандартным приемом "обхода" такого рода проблем.
Пункт 03 Другие заголовочные файлы
Вставка других заголовочных файлов представляет собой следующий шаблон:
/* Включение заголовочных файлов */ #ifndef __"имя файла1"_H #include ""имя файла1"".h #endif #ifndef __"имя файла2"_H #include <"имя файла2">.h #endif …
Обратите внимание, что оператор вставки файла " #include " окружен "условными прагма операторами" " #ifndef " и " #endif ". Их использование предотвращает повторную загрузку заголовочных файлов и, таким образом, предотвращает повторное определение или переопределение типов, констант и переменных, указанных в них.
Пункт 04 Вставка необходимых прагма операторов
Эти операторы вставляются в текст только по-необходимости, и часто их включения не требуется.
Пункт 05 Определение констант и макроподстановок
Сюда вставляются определения констант и макроподстановок, определенных через прагма оператор #define. Конечно, его использование может некоторыми авторами рассматриваться как "анахронизм". Однако оцените его удобство и универсальность!
Определение представляет собой следующий шаблон:
/* Определение констант */ #define "ИМЯ_КОНСТАНТЫ" "значение" /* Определение макроподстановок */ #define "МАКРОФУНКЦИЯ"("ПАРАМЕТРЫ") "текст макроса"
Пункт 06 Объявление структур, объединений и перечисляемых типов
Объявления представляют собой следующий шаблон:
typedef struct "tagType" { "определение типа Type" }"Type"; typedef union "tagType" { "определение типа Type" }"Type"; typedef enum "tagType" { "определение типа Type" }"Type";
Пункт 07 Объявление глобальных переменных
Иногда необходимо в файле задать переменные, которые будут использоваться сразу несколькими описанными функциями. Эти переменные можно объявить как "глобальные переменные", а не передавать в качестве параметров. Это может создать более понятные и "компактные" программы. Эти объявления можно описать как в заголовочном файле, так и в начале файлов с описанием (определением) нужных функций.
Объявление представляет собой следующий шаблон:
/* Объявление глобальных переменных */ "тип" "имя" … …;
Пункт 08 Объявление функций
Перед использованием новых функций на языке Си необходимо прежде их объявить, что и происходит в конце заголовочного файла.
Объявление представляет собой следующий шаблон:
/* Объявление функций: */ "тип возвр. значения" "имя функции1"("имя и тип формальных параметров"…); "тип возвр. значения" "имя функции2"("имя и тип формальных параметров"…); …
Пример шаблона
/********************************************************** * * Файл <имя файла>.H * * НАЗНАЧЕНИЕ: * * ЗАВИСИМОСТИ: * * Copyright (R) * **********************************************************/ #ifndef __"имя файла"_H #define __"имя файла"_H /* Включение заголовочных файлов */ #ifndef __"имя файла1"_H #include ""имя файла1"".h #endif #ifndef __"имя файла2"_H #include <"имя файла2">.h #endif … /* Указание директив компилятору: */ … /* Определение констант */ #define "ИМЯ_КОНСТАНТЫ" "значение" /* Определение макроподстановок */ #define "МАКРОФУНКЦИЯ"("ПАРАМЕТРЫ") "текст макроса" /* Определение типов */ typedef enum tag"имя типа" { "константа 1"; … "константа n"; }"имя типа"; typedef struct tag"имя типа" { "тип" "имя поля"; … …; }"имя типа"; typedef union tag"имя типа" { "тип" "имя поля"; … …; }"имя типа"; /* Объявление глобальных переменных */ "тип" "имя" … …; /* Объявление функций: */ "тип возвр. значения" "имя функции1"("имя и тип формальных параметров"…); "тип возвр. значения" "имя функции2"("имя и тип формальных параметров"…); … #endif /* Конец заголовочного файла */
3.6.2. Приложение II. Стандартные шаблоны оформления модулей и библиотек на Perl
Подпрограммы служат для объединения группы операторов с целью их повторного использования. Следующим шагом является объединение группы подпрограмм и их сохранение в отдельном файле для последующего использования в других программах. Для реализации этой задачи в языке Perl присутствуют два механизма: библиотеки и модули.
3.6.2.1. Библиотеки Perl
Библиотека представляет собой пакет, областью действия которого является отдельный файл. Иными словами, библиотека - это файл, в качестве первой строки содержащий объявления пакета:
package "имя пакета"Листинг 3.8.
Имя файла библиотеки обычно имеет расширение "*.pl".
Для использования библиотеки в основной программе ее нужно подключить при помощи директивы компилятору require. О синтаксисе и назначении функции require смотри раздел 3.7.2.3.1.
3.6.2.1.1. Создание библиотечного файла
Для создания собственной библиотеки следует выполнить перечисленные ниже шаги:
- Создать каталог для хранения библиотечных файлов;
- Сохранить наборы программ в отдельных файлах-библиотеках, и поместить их в этот каталог;
- В конец каждого библиотечного файла поместить строку: "1:".
Последний пункт служит для того, чтобы возвращаемое значение функции require не равнялось нулю.
Пример:
# библиотечный файл ~/bin/perllib/mylib.pl # знак "~" означает домашний каталог пользователя "подпрограмма 1" "подпрограмма 2" … 1:
3.6.2.1.2. Подключение библиотечного файла
Для подключения библиотечного файла из собственной библиотеки следует выполнить перечисленные ниже шаги:
- Добавить, после начальной директивы Perl, в массив @INC имя каталога, содержащего библиотечные файлы (смотри п. 3.7.2.1.1), либо при запуске основной программы передать это имя интерпретатору Perl при помощи ключа -I;
- В основной программе использовать директиву require, указав в качестве аргументов имена требуемых библиотечных файлов.
Пример.
#!/usr/bin/perl unshift( @INC, "~/bin/perllib"); require "mylib.pl"; "тело макроса" …