Основы алгоритмического языка С++
Информация - Компьютеры, программирование
Другие материалы по предмету Компьютеры, программирование
ных деклараторов рассматривались в разделе 4.3.2.
Примеры:
int add(int, int); /* Example 1 */
double calc(); /* Example 2 */
char *strfind(char *,...); /* Example 3 */
void draf(void); /* Example 4 */
double (*sum(double, double)) [3]; /* Example 5 */ int (*select(void)) (int) ; /* Example 6 */
char *p; /* Example 7 */
short *q;
int prt(void *);
В первом примере объявляется функция, поименованная add, которая требует два аргумента типа int и возвращает величину типа int.
Во втором примере объявляется функция, поименованная calc, которая возвращает величину типа double. Список типов аргументов не задан. В третьем примере объявляется функция, поименованная strfind, которая возвращает указатель на величину типа char. Функция требует, по крайней мере один аргументуказатель на величину типа char. Список типов аргументов заканчивается запятой с многоточием, обозначающим, что функция может потребовать большее число аргументов.
В четвертом примере объявляется функция с типом возврата void (нет возвращаемой величины). Список типов аргументов также void, означающий отсутствие аргументов для этой функции.
В пятом примере sum объявляется как функция, возвращающая указатель на массив из трех величин типа double. Функция sum требует два аргумента, каждый из которых является величиной типа double.
В шестом примере функция, поименованная select, объявлена без аргументов и возвращает указатель на функцию. Указатель возврата ссылается на функцию, требующую один аргумент типа int и возвращающую величину типа int.
В седьмом примере объявлена функция prt, которая требует аргумент- указатель любого типа, и которая возвращает величину типа int. Любой указатель p или q могли бы быть использованы как аргументы функции без выдачи при этом предупреждающего сообщения.
Классы памяти
Класс памяти переменной, которая определяет какой либо объект, имеет глобальное или локальное время жизни. Объект с глобальным временем жизни существует и имеет значение на протяжении всей программы. Все функции имеют глобальное время жизни.
Переменные с локальным временем жизни захватывают новую память при каждом выполнении блока, в котором они определены. Когда управление на выполнение передается из блока, то переменная теряет свое значение.
Хотя Си определяет два типа классов памяти, но, тем не менее, имеется следующих четыре спецификатора классов памяти:
auto
register
static
extern
Объекты классов auto и register имеют локальное время жизни. Спецификаторы static и extern определяют объекты с глобальным временем жизни. Каждый из спецификаторов класса памяти имеет определенный смысл, который влияет на видимость функций и переменных в той же мере, как и сами классы памяти. Термин "видимость" относится к той части программы, в которой могут ссылаться друг на друга функции и переменные. Объекты с глобальным временем жизни существуют на протяжении выполнения исходной программы, но они могут быть видимы не во всех частях программы. Видимость и связанная с ней концепция времени жизни рассмотрена в разделе 3.5.
Месторасположение объявления переменной или функции внутри исходных файлов также влияют на класс памяти и видимость. Говорят, что объявления вне определения всех функций и переменных относятся к внешнему уровню, а объявления внутри определений функций относятся к внутреннему уровню.
Точный смысл каждого спецификатора класса памяти зависит от того, находится ли объявление на внешнем или внутреннем уровне и от того, объявлен ли объект функцией или переменной. В следующем разделе описывается смысл спецификаторов класса памяти в каждом случае объявления, а также объясняется режим умолчания, когда спецификатор класса памяти опущен при объявлении переменной или функции.
Объявления переменной на внешнем уровне
Объявления переменной на внешнем уровне используют спецификаторы класса памяти static и extern или совсем опускают их. Спецификаторы класса памяти auto и register не допускаются на внешнем уровне.
Объявления переменных на внешнем уровне- это определения переменных или ссылки на определения, сделанные в другом месте.
Объявление внешней переменной, которое инициализирует эту переменную (явно или неявно), называется определением этой переменной. Определение на внешнем уровне может задаваться в следующих различных формах:
-переменная на внешнем уровне может быть определена путем ее объявления со спецификатором класса памяти static. Такая переменная может быть явно инициализирована константным выражением. Если инициализатор отсутствует, то переменная автоматически инициализируется нулем во время компиляции. Таким образом, объявления static int k = 16; и static int k; оба рассматриваются как определения;
-переменная определяется, когда она явно инициализируется на внешнем уровне. Например, int j = 3; это определение переменной.
Так как переменная определяется на внешнем уровне, то она видима в пределах остатка исходного файла, от места, где она определена. Переменная не видима выше своего определения в том же самом исходном файле ни в других исходных файлах программы, если не объявлена ссылка, которая делает ее видимой.
Переменная может быть определена на внешнем уровне внутри исходного файла только один раз. Если задается спецификатор класса памяти static, то в других исходных файлах могут быть определены переменные с тем же именем. Так как каждое определение static видимо только в пределах своего собственного исходного файла, то конфликта не возникнет.
Спецификатор класса памяти extern используется для объявления ссылки на переменную, опреде