|
Программирование >> Программирование на языке c++
ные. Передача значения из вызванной функции в вызвавшую происходит с помощью оператора возврата, который записывается в виде 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 (если
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |