Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BOOK_С_INTUIT.docx
Скачиваний:
31
Добавлен:
11.02.2015
Размер:
6.34 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]. Приведем характеристику спецификаторов классов памяти.

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