ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
ДИРЕКТИВЫ ПРЕПРОЦЕССОРАВ любую функцию могут быть включены директивы (команды) препроцессора. Препроцессор – это пакет программ для предварительной (до компиляции) обработки текста программы на Си. Препроцессор является мощным средством программиста, позволяющим облегчить написание и отладку программ, а также улучшить их читаемость. Препроцессор позволяет: - подключать к данной программе файлы с другими программами (функциями) или собирать одну программу из нескольких файлов, - осуществлять подстановку имен, - включать в программу макроопределения (макросы). Управление работой препроцессора осуществляется директивами, дающими команду препроцессору на выполнение определенных действий. Обработанный препроцессором текст программы передается компилятору для перевода на машинный язык и далее – на сборку (компоновку) программы и ее выполнение.
Включение файлов Программа на языке Си обычно состоит из нескольких функций, хранящихся в различных файлах на внешних носителях. Отдельная функция тоже может быть разбита на несколько кусков, каждый из которых может храниться в отдельном файле. Директива включения файлов #include позволяет найти на внешнем носителе заданный файл и подключить его к головной программе или вызываемой функции. Так создается единый файл, в котором собрана вся программа. Кроме того, директива включения файлов позволяет подключать к программе пользователя стандартные библиотеки Си, например библиотеку функций ввода-вывода, хранящуюся в файле stdio.h (standard input/output header file). Файлы с расширением имени.h называются заголовочными файлами. Они содержат описание переменных, функций и типов, используемых программистами, – аналог раздела INTERFACE в описании модулей Паскаля. Директивы включения таких файлов помещаются перед заголовками функций: #include <stdio.h> #include <conio.h> #include <math.h> Заключение имени файла в угловые скобки < > говорит о том, что этот файл находится в системном каталоге Си, содержащем библиотеки стандартных программ. Если имя файла заключено в кавычки “”, то он отыскивается по указанному пути: #include “d:\user\my_file_1.cpp” и вставляется в программу вместо этой директивы. Так программа собирается из отдельных кусков: #include <stdio.h> #include <conio.h> #include <math.h> Int main() { #include “d:\user\my_file_1.cpp” #include “d:\user\my_file_2.cpp” #include “d:\user\my_file_3.cpp” Return 0; } Содержимое файла my_file_1.cpp: Int age, rost; Float weight; char name[10]; Содержимое файла my_file_2.cpp: printf(“\nВаше имя: ”); scanf(“%s”, name); printf(“\nВаш возраст: ”); scanf(“%d”, &age); printf(“\nВаш рост: ”); scanf(“%d”, &rost); printf(“\nВаш вес: ”); scanf(“%f”, &weight); Содержимое файла my_file_3.cpp: printf(“\nВы ввели:”); printf(“\nИмя - %s”, name); printf(“\nВозраст - %d”, age); printf(“\nРост - %d”, rost); printf(“\nВес - %4.1f”, weight); printf(“\n”); После выполнения этих директив программа приобретает законченный вид: #include <stdio.h> #include <conio.h> #include <math.h> Int main() { Int age, rost; Float weight; char name[10]; printf(“\nВаше имя: ”); scanf(“%s”, name); printf(“\nВаш возраст: ”); scanf(“%d”, &age); printf(“\nВаш рост: ”); scanf(“%d”, &rost); printf(“\nВаш вес: ”); scanf(“%f”, &weight); printf(“\nВы ввели:”); printf(“\nИмя - %s”, name); printf(“\nВозраст - %d”, age); printf(“\nРост - %d”, rost); printf(“\nВес - %4.1f”, weight); printf(“\n”); Return 0; } После подключения указанных заголовочных файлов (.h) программа компилируется, компонуется и запускается на выполнение. С системой программирования Си поставляются готовые включаемые файлы, содержащие стандартные библиотеки: - stdio.h – ввода-вывода со стандартными функциями ввода-вывода getch, putch, gets,puts, scanf, printf, - math.h – математических функций.
Подстановка имен Подстановка имен или замена идентификаторов осуществляется директивой: #define ИМЯ константа (имя) Например: #define MAX 100 Выполняя эту директиву, препроцессор в программе вместо переменной с именем MAX подставит число 100. После слова define и имени необходимо оставить по пробелу. Так можно легко заменить в программе значения констант, поменяв их только в директиве #define. Эту же директиву можно использовать и для замены одного имени на другое, более удобное или привычное: #define AND && #define OR || Сейчас можно писать программу, используя в качестве логических операций более привычные слова AND и OR. Препроцессор заменит эти известные каждому программисту слова на операции && и ||, используемые в Си. Директива #define может стоять в любом месте программы. Область ее действия – от места ее появления до конца программы или до директивы #undef ИМЯ Макросы Директива #define позволяет осуществлять более сложные подстановки, #define SUMMA(x,y) ((x)+(y)) При этом каждое вхождение в текст программы выражения SUMMA(a,b) заменяется препроцессором на выражение ((a)+(b)), причем формальные аргументы макроса x и y заменяются соответственно на фактические аргументы (константы, переменные, элементы массивов, выражения) a и b, для которых и вычисляется значение макроса: r=SUMMA(2,3); В этом случае значение переменной r будет равно 5. В общем виде эта директива записывается следующим образом: #define ИМЯ (список аргументов) выражение После слова define и перед выражением должны стоять пробелы. Подставляемое выражение и каждый формальный аргумент в нем необходимо взять вскобки. Если оно не помещается на одной строке, то его можно продолжить на следующих, используя слэш: #define SUMMA(x,y) ((x)+\ (y)) Макросы похожи на функции, но их обработка не приводит к вызову функций со связанными с этим расходами по передаче аргументов, распределению памяти, возврату значения, что имеет место, когда мы работаем с функциями. Макросы обрабатываются на этапе препроцессирования, а не во время выполнения, и поэтому они могут сократить время выполнения программы. Кроме того, они работают с любыми типами аргументов, в то время как для функции нужно или выполнять приведение типов аргументов, или иметь несколько вариантов функции для различных типов аргументов. Директиву можно использовать и для обращения к стандартным функциям: #define VYVOD puts(“Programma studenta Vasi Pupkina”) Выполняя эту директиву, препроцессор заменит в программе все встретившиеся имена VYVOD на функцию вывода puts(“Programma studenta Vasi Pupkina”). По общепринятым правилам имена, используемые в директивах препроцессора, пишутся заглавными буквами, поэтому и в тексте программы они должны быть записаны так же. Не нашли, что искали? Воспользуйтесь поиском:
|