Программирование >>  Программирование на языке c++ 

1 ... 151 152 153 [ 154 ] 155 156 157 ... 159


ные. Передача значения из вызванной функции в вызвавшую происходит с помощью оператора возврата, который записывается в виде

return выражение;

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

Если в качестве аргумента функции используется имя массива, то передается начало массива (адрес начала массива), а сами элементы не копируются. При этом соответствующий параметр задается в одном из следующих трех видов: ♦ как массив, например int m[100];

♦ как массив без указания его размерности, например int mQ;

как указатель, например int *m (этот вариант используется наиболее часто).

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

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

Указатель на функцию как раз и задает эту точку входа. Объявление вида

int (*f)();

говорит о том, что f - это указатель на функцию без аргументов, возвращающую целое значение. Первая пара скобок необходима, без них int *f(); означало бы, что f - функция, возвращающая указатель на целое значение. После объявления указателя на функцию в программе можно использовать объекты: *f- функция; f - указатель на функцию.

В программе на языке С можно передавать аргументы из командной строки. Когда в начале вычислений производится обращение к функции main, ей передаются два параметра (в некоторых случаях три параметра, последний из которых является указателем на символьные строки специального назначения, например на окружение в операционной системе MS-DOS). Первый параметр определяет число командных аргументов при обращении к программе. Второй представля-



ет собой массив указателей на символьные строки, содержащие эти аргументы (в одной строке - один аргумент). Предположим, что выполняемая программа имеет имя my prog и функция main объявлена в ней, например, так:

main (int argc,cliar *argv[]) { /* ... */ }

Запустим программу на выполнение из командной строки следующим образом:

my prog Aveiro Coimbra Coviiha <Enter>

Тогда argc=4, и argv[0] - это указатель на my prog, argv[l] - на строку Aveiro и т.п. Если argc=l, то после имени программы в командной строке параметров нет.

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

1.11. Препроцессор. Препроцессор осуществляет подстановки для макровызовов, подключает заданные файлы и выполняет другие полезные функции. Для него предназначены строки программы, начинающиеся с символа # (в одной строке разрешается записывать только одну команду). Рассмотрим некоторые директивы препроцессора, которые были использованы в этой книге.

Директива

#define идентификатор подстановка

вызывает замену в последующей программе названного идентификатора на текст подстановка. Если директива имеет вид

#define идентификатор (идентификатор,....идентификатор)

подстановка

причем между первым идентификатором и открывающейся круглой скобкой нет пробела, то это определение макроподстановки с аргументами. При наличии длинных определений в подстановке, продолжающихся в следующей строке, в конце очередной строки с продолжением ставится символ /. Директивы:

#include имя файла

#include <имя файла>

включают в программу файлы с указанным именем. Первая из них загружает файл из текущего либо из заданного в качестве префикса каталога. Вторая команда осуществляет поиск



файла В стандартных местах, определенных в системе программирования.

Следующая группа директив позволяет избирательно компилировать части программы. Этот процесс называется условной компиляцией. В нее входят директивы: #if, #elif, #endif, #ifdef, #ifndef. Основная форма записи директивы #if представляется в виде:

#if константное вьгражение

п оследовател ьность и нстру кци й #endif

Здесь проверяется значение константного выражения. Если оно истинно, то выполняется заданная последователь-ность инструкций, а если ложно, то эта последователь-ность инструкций пропускается.

Действие директивы #еке подобно действию команды else, например:

#if константное выражение

последовательность инструкций 1

#else

последовательность инструкций 2 #endif

Здесь если константное выражение истинно, то выполняется последовательность инструкций 1, а если ложно - после-довательность инструкций 2.

Директива #ellf означает действие типа else - if.

Директива

#ifdef идентификатор

устанавливает, определен ли в данный момент указанный идентификатор, т.е. входил ли он в команду вида #define. Строка вида #ifndef

проверяет, не определен ли в данный момент указанный идентификатор.

За любой из этих команд может следовать произвольное число строк текста, возможно, содержащих инструкцию #else и заканчивающихся строкой #endif. Если проверяемое условие истинно, то игнорируются все строки между #else и #endif, а если ложно, то строки между проверкой и #else (если



1 ... 151 152 153 [ 154 ] 155 156 157 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика