Опубликован: 23.10.2009 | Уровень: для всех | Доступ: свободно
Лекция 3:

Парадигмы программирования

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >

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.
Примечание: информацию о том, что такое пакет, можно посмотреть, например, в [59].

Имя файла библиотеки обычно имеет расширение "*.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";
"тело макроса"
…
< Лекция 2 || Лекция 3: 1234 || Лекция 4 >