Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 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”).

По общепринятым правилам имена, используемые в директивах препроцессора, пишутся заглавными буквами, поэтому и в тексте программы они должны быть записаны так же.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных