Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BOOK_С_INTUIT.doc
Скачиваний:
4
Добавлен:
19.09.2019
Размер:
7.91 Mб
Скачать

Контрольные вопросы

  1. Как осуществляется нумерация разрядов байта?

  2. Для каких систем счисления в языке С имеются классификаторы форматируемых данных?

  3. Какие логические поразрядные операции существуют в языке С?

  4. Какие логические операции сдвига существуют в языке С? Какими операторами они реализуются?

  5. Что такое битовое поле в языке С? Где оно может быть определено?

  6. В чем различие поразрядных и логических операторов НЕ, И и ИЛИ?

  7. Как можно обменять значения двух целочисленных переменных без использования третьей переменной?

  8. Чем отличается операция сдвига вправо для типов int и unsigned?

Библиографический список

  1. Прата С. Язык программирования С. Лекции и упражнения : пер. с англ. / С. Прата. – 5-е изд. – М.: Вильямс, 2006. – 960 с.

  2. Кочан С. Программирование на языке С : пер. с англ./С. Кочан. – 3-е изд.– М.: Вильямс, 2007. – 496 с.

  3. Подбельский В.В. Программирование на языке Си: учеб. пособие/ В.В.Подбельский, С.С.Фомин. – 2-е изд., доп. – М.: Финансы и статистика, 2007. – 600 с.

Тема 17 Программы, состоящие из нескольких файлов, на языке с

Рассматриваются вопросы сборки программы, состоящей из нескольких функций, расположенных в разных файлах, а также дополнительные обращения к функциям.

ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

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

Простейший метод использования нескольких функций требует их размещения в одном и том же файле. Затем выполняется компиляция этого файла, как если бы он содержал единственную функцию [1]. Другие подходы к решению этой проблемы существенно зависят от конкретной операционной системы (Unix-подобные системы, Windows, Macintosh). Компиляторы операционных систем Windows и Macintosh представляют собой компиляторы, ориентированные на проекты [1]. Проект описывает ресурсы, используемые программой. Эти ресурсы включают файлы исходного программного кода.

Если поместить главную функцию main() в один файл, а определения собственной функции программиста – во второй, то первому файлу нужны прототипы функций. Для этого их можно хранить в одном из заголовочных файлов. Хорошим тоном в программировании считается размещение прототипов функций и объявление их констант в заголовочном файле [1]. Назначение отдельных задач отдельным функциям способствует улучшению программы.

Функция может быть либо внешней (по умолчанию), либо статической. К внешней функции доступ могут осуществлять функции из других файлов, в то время как статическая может использоваться только в файле, в котором она определена [1]. Например, возможны следующие объявления функций:

double gamma(); // внешняя функция по умолчанию

static double beta();

extern double delta();

Функции gamma() и delta() могут вызываться функциями из других файлов, которые являются частью программы, тогда как beta() – нет. В силу этого применение последней ограничено одним файлом, поэтому в других файлах можно определять функции с тем же именем. Одна из причин использования класса статической памяти заключается в необходимости создания функций, приватных для конкретных модулей, благодаря чему во многих случаях удается избежать конфликта имен [1].

Обычно при объявлении функции, определенной в другом файле, указывается ключевое слово extern. Однако этим достигается большая ясность, поскольку функция при объявлении и предполагается как extern, если только не задано ключевое слово static.

Одно из «золотых правил» надежного программирования – соблюдение принципа «необходимости знать», или принципа минимально необходимой области видимости [1]. Рекомендуется держать всю внутреннюю работу каждой функции максимально закрытой по отношению к другим функциям, используя совместно только те переменные, без которых нельзя обойтись по логике программы. Другие классы памяти полезны, и ими можно воспользоваться. Однако всякий раз следует задаваться вопросом: есть ли в этом необходимость.

Память, использованная для хранения данных, которыми манипулирует программа, обладает такими характеритсиками, как продолжительность хранения, область видимости и связывание [1]. Продолжительность хранения может быть статической, автоматической или распределенной. При статической, память распределяется в начале выполнения программы и остается занятой на протяжении всего выполнения, при автоматической память под переменную выделяется в момент, когда выполнение программы входит в блок, в котором эта переменная определена, и освобождается, когда выполнение программы блок покидает.

Выделение памяти осуществляется с помощью функции malloc()(или родственной функции) и освобождается память посредством функции free(). Область видимости означает, какая часть программы может получить доступ к данным. Переменные, определенные вне пределов функции, имеют область видимости в пределах файла и видимы в любой функции данного файла. Переменная блока видима только в этом блоке и в любом из блоков, вложенных в него.

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

Стандарт языка С поддерживает 4 спецификатора класса памяти [2]:

extern

static

register

auto

Спецификаторы сообщают компилятору, как он должен разместить соответствующие переменные в памяти. Спецификатор класса памяти в объявлении всегда должен стоять первым [2]. Приведем характеристику спецификаторов классов памяти.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]