Направления программирования. История создания языка Си. Особенности языка, страница 26

Любая переменная, описанная в файле вне какой-либо функции и не имеющая спецификатора класса памяти, по умолчанию относится к классу памяти для внешних переменных. Такие переменные называются глобальными. Память для таких переменных отводится один раз и остается занятой до окончания работы программы. Область действия такой переменной – до конца файла. Доступ к внешним переменным возможен и из других файлов. Для того, чтобы можно было использовать переменную в других файлах, для нее следует явно указать класс памяти extern.

Пример:

// <файл1>.с

# include<stdio.h>

void fanc(int x)

{ printf(“x=%d”, x);}

# <файл2>.с

extern void fanc(int x);

void main(void)

{fanc(100);}

Все сказанное выше относится к той ситуации, когда мы создаем проект (project). Меню project содержит пункт Open project. Вводим имя, и создается файл с расширением prj - <имя>.pri. С помощью пункта меню Add item добавляются файлы в проект. Можно добавлять файлы и с расширением *.с, либо *.obj.

Программа  файла2 будет работать, когда этот файл создадим <файл3>.prj и добавим в эти 2 файла; иначе, если не создадим *.prj, то будет сообщение об ошибке.

Преимущество prj:

1)  можно создавать библиотеку;

2)  если нет исправлений, - компиляция файлов, подключенных к проекту, не происходит. При использовании include файлы компилируются.

// <файл1>h

extern void fanc1(int x);     интерфейс

extern void fanc2(int x);

// <файл1>.с

# include<stdio.h>   # include “<файл1>.h”

void fanc1(int x)

{printf(“x=%d”, x);}

void fanc2(int)

{printf(“x*x=%d”, x*x);}

// <файл2>.с

# include “<файл1>.h”

void main(void)

{fanc1(10);

fanc2(20);}

Посредством директивы # include осуществляется связь между модулями на уровне исходного кода.

п.15.Модульное программирование и функции.

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

Этапы создания модульной программы.

1.  Определение функций решения частных алгоритмических задач.(функциональная декомпозиция)

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

3.  Создание файлов-заголовков, объектных модулей и библиотек.

Для того чтобы отдельная функция способствовала рациональному разбиению программы на модули, она должна соответствовать следующим критериям:

-  Функция должна выполнять точно сформулированную и четко ограниченную задачу.

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

-  Для использования функции в нескольких модулях программы необходимо тщательно разработать   интерфейс  функции:

1)  Интерфейс не должен быть сложным (т.е. должен включать небольшое количество параметров)

2)  Функции, которые должны быть объедены в библиотеках, следует разрабатывать как совершенно независимые от основной программы, т.е. в этом случае следует избегать глобальных переменных. При необходимости они должны быть описаны в заголовочном файле.

Модуль содержит:

1)  код, описывающий алгоритм решения частной задачи;

2)  директиву # include, определяющую заголовочный файл.

Каждый модуль должен быть связан с заголовочным файлом. Этот файл имеет то же имя, что и модуль, но в отличие от модуля имеет расширение *.h, а не *.c. Заголовочный файл содержит прототипы всех функций, содержащихся в модуле. Кроме того, в нем могут содержаться объявления констант и переменных.

Заголовочные файлы всех модулей, входящих в состав проекта, следует включить с помощью директивы # include в состав файла с функцией main().

Создание собственной библиотеки кода.