- •Предисловие
- •Библиографический список
- •Контрольные вопросы
- •Библиографический список
- •Тема 2 Переменные и базовые типы данных языка с
- •Контрольные вопросы
- •Библиографический список
- •Тема3 Организация циклов в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 4 Принятие решений. Условные операторы в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 5 Числовые массивы в языке программирования с
- •Тип имя_массива[размер];
- •Тип имя_массива[размер1] [размер2];
- •Тип имя_массива[размер1] [размер2] [размерN];
- •Контрольные вопросы
- •Библиографический список
- •Тема 6 Символьные массивы в языке с. Работа со строками
- •Тип имя_массива[размер];
- •Тип имя_массива[размер1] [размер2];
- •Тип имя_массива[размер1] [размер2] [размерN];
- •Контрольные вопросы
- •Библиографический список
- •Тема 7 Указатели в языке программирования с
- •Int *ptr; // объявили указатель на целую переменную
- •Контрольные вопросы
- •Библиографический список
- •Тема 8 Указатели и массивы в языке с
- •Int data[7]; // обычный массив
- •Int *pd[7]; // массив указателей
- •Контрольные вопросы
- •Библиографический список
- •Тема 9 Динамическое распределение памяти в языке с
- •If (!ptr) // условие логического отрицания
- •If (!ptr) // условие логического отрицания
- •Контрольные вопросы
- •Библиографический список
- •Тема 10 Функции Общие сведения о функциях языка с
- •Fun(тип имя_перем1, тип имя_перем2, , тип имя_перем n)
- •Контрольные вопросы
- •Библиографический список
- •Тема 11 Указатели и функции в языке программирования с
- •Тип_возвращаемый_функцией(*имя_указателя_на_функцию)(аргументы);
- •Контрольные вопросы
- •Библиографический список
- •Тема 12 Файловый ввод/вывод в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 13 Структуры – производные типы данных языка с
- •Int age; // возраст
- •Int age; // возраст
- •Int age; // возраст
- •Int age; // возраст
- •Int age; // возраст
- •Int age; // возраст
- •Контрольные вопросы
- •Библиографический список
- •Тема 14 Объединения и перечислимые типы в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 15 Структуры и функции языка с
- •Контрольные вопросы
- •Библиографический список
- •Тема 16 Операции с разрядами (битами) в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 17 Программы, состоящие из нескольких файлов, на языке с
- •Спецификатор extern
- •Спецификатор static
- •Спецификатор register
- •Спецификатор auto
- •Контрольные вопросы
- •Библиографический список
- •Тема 18 Рекурсивные алгоритмы и функции
- •Переместить (a, b);
- •Контрольные вопросы
- •Библиографический список
- •Тема 19 Препроцессор языка с
- •Директива #define
- •Директива #error
- •Директива #include
- •Директивы условной компиляции
- •2_ Я_последовательность операторов программного кода
- •3_ Я_последовательность операторов программного кода
- •Директива #line
- •Директива#pragma
- •Предопределенные символические константы
- •Макрос подтвержденияassert
- •Контрольные вопросы
- •Библиографический список
- •Тема 20 Программы на языке с при использовании статически подключаемой библиотеки
- •Контрольные вопросы
- •Библиографический список
- •Тема 21 Использование аргументов командной строки в с
- •Контрольные вопросы
- •Контрольная работа № 2 Покупки в супермаркете
- •Приложение Управление конфигурациями проекта в Visual Studio 2010
Спецификатор extern
В языке Спри редактировании связей к переменной может применяться одно из трех связываний: внутреннее, внешнее или не относящееся ни к одному из этих типов. В общем случае для имен функций и глобальных переменных предназначено внешнее связывание. Это означает, что после компоновки они будут доступны во всех файлах, составляющих программу. К объектам, объявленным со спецификаторомstaticи видимым на уровне файла, применяется внутренне связывание, после компоновки они будут доступны только внутри того файла, в котором объявлены. К локальным переменным связывание не применяется, и поэтому они доступны только внутри своих блоков.
Спецификатор externуказывает на то, что к объекту применяется внешнее связывание.
Объявление(декларация) объявляет имя и тип объекта.Описание(определение, дефиниция) выделяет для объекта участок памяти, где он будет находиться. Один и тот же объект может быть объявлен неоднократно в разных местах, но описываться только один раз.
Рассмотрим пример применения спецификатора externглобальным переменным:
#include <stdio.h> #include <conio.h>
// Главная функция int main (void) { // Объявление глобальных переменных extern int a, b;
printf("\n\t a = %d; b = %d\n", a, b); printf("\n Press any key: "); getch(); return 0; }
// Инициализация (описание) глобальных переменных int a = 33, b = 34; |
Описание глобальных переменных дано за пределами главной функции main(). Если бы их объявление и инициализация встретились передmain(), то в объявлении со спецификаторомexternне было бы необходимости.
При компиляциивыполняются следующие правила:
если компилятор находит переменную, не объявленную внутри блока, он ищет ее объявление во внешних блоках;
если не находит ее там, то ищет среди объявлений глобальных переменных.
Спецификатор externиграет большую роль в программах, состоящих из многих файлов [3]. В языкеСпрограмма может быть записана в нескольких файлах, которые компилируются раздельно, а затем компонуются в одно целое. В этом случае необходимо как-то сообщить всем файлам о глобальных переменных программы. Самый лучший (и легко переносимый) способ сделать это – определить (описать) все глобальные переменные в одном файле и объявить их со спецификаторомexternв остальных файлах. Например:
Первый файл (main.c) |
Второй файл (second.h) |
#include <stdio.h> #include <conio.h> #include "D:\second.h"
int x = 99, y = 77; char ch; void func1(void); int main(void) { ch = 'Z'; func1();
printf("\n Press any key: "); getch(); return 0; }
void func1(void) { func22(); func23();
printf("\n\t x = %d; y = %d;\ ch = %c\n", x, y, ch); } |
extern int x, y; extern char ch;
void func22(void) { y = 100; }
void func23(void) { x = y/10; ch = 'R';
}
|
В программе первый файл – это основная часть программного проекта. Второй файл создан как текстовый (с помощью блокнота) с расширением *.h. Список глобальных переменных (x,y,ch) копируется из первого файла во второй, а затем добавляется спецификаторextern, сообщающий компилятору, что имена и типы переменных, следующих далее, объявлены в другом месте. Все ссылки на внешние переменные распознаются в процессе редактирования связей. Подключение второго файла выполнено с указанием имени диска (D:), на котором расположен файлsecond.h. Для подключения имени файла, созданного пользователем, его заключают в двойные кавычки.
Результат выполнения программы показан на рис.17.1.
Рис.17.1. Результат выполнения программы, состоящей из двух файлов
В общем случае h-файл (например,second.h) формируется редактором кода: надо создать заготовку обычным способом, очистить все поле редактора и записать в него необходимые данные (программный код созданной функции), затем выполнить команду главного менюFile/Save asи выбрать для сохраняемого файла расширение.hв раскрывающемся списке типов сохраняемого файла:C++ Header Files(*.h; *.hh; *.hpp; *.hxx; *.inl; *.tlh; *.tli). Сохраненный файл с расширением.hследует подключить к проекту. Для этого потребуется в узлеSolutionExplorerнавести курсор мыши к папкеHeaderFilesи правой кнопкой мыши выбратьAddExistingItemсохраненный файлsecond.h. Затем с помощью оператора#includeфайл нужно включить в основную программу. Другой способ, реализуемый вMicrosoftVisualStudio2010, состоит в том, чтобы сразу через пункт менюFile выбрать New File и далее в списке Installed Templates Visual C++ Header File (.h). Откроется окно, представленное на рис.17.2.
Рис. 17.2. Процесс создания нового файла с расширением .h
Далее в правом нижнем углу нажмем клавишу Open. Откроется пустое поле – заготовка для набора необходимого кода. По умолчанию этот файл имеет имяHeader1.h. При повторном создании заголовочного файла это будетHeader2.hи т.д. После написания кода можно сохранить этот заголовочный файл по желанию в любом каталоге с любым (допустимым) именем (расширение остается.h).