Идентификация функций и макро



Большинство процедур библиотеки Си - это функции, поэтому они состоят из скомпилированных Си-операторов. Некоторые процедуры выполняются как макро. "Макро" - идентификатор, определенный при помощи препроцессорной директивы языка Си #define, представляет значение или выражение. Аналогично функциям, макро может определять ноль или больше аргументов, которые заменяют формальные параметры в определениях макро.

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

Наиболее важные различия между макро и функцией:

1) Некоторые макро не могут обрабатывать аргументы с побочными эффектами.

2) Идентификатор макро не обладает теми же свойствами, что идентификатор функции. В частности, идентификатору макро не соответствует адрес, а идентификатору функции - соответствует. Поэтому в контексте нельзя использовать идентификатор макро, как содержимое указателя. Например, если идентификатор макро используется как аргумент вызова функции, то пересылается значение, возвращаемое макро. Если же в качестве аргумента используется идентификатор функции, то пересылается адрес функции.

3) Поскольку макро не являются функциями, они и указатели на макро не могут быть объявлены. Поэтому проверка типов аргументов макро не производится. Однако, компилятор обнаруживает случаи неправильного задания числа аргументов в макро.

4) Библиотечные процедуры, выполняемые как макро, описываются при помощи препроцессорных директив в библиотечных include-файлах. Для использования библиотеки макро необходимо выбрать соответствующий файл, иначе макро не будет определен.

Пример:

#include <ctype.h>

int a='m';

a=toupper(a++);

В этом примере содержится процедура toupper из стандартной библиотеки Си. Здесь процедура toupper выполняется как макро, ее определение задано в <ctype.h>:

#define toupper (c)

((islower(c)? toupper(c):(c))

В приведенном определении используется условная операция (?:). В условном выражении аргумент "c" вычисляется дважды: первый раз - если он задан буквой нижнего регистра, второй раз – при возврате соответствующего значения. По этим причинам аргумент "a++" также должен быть вычислен дважды. В результате значение "a" должно увеличиться два раза и значение, выработанное по islower, отличается от значения, выработанного по toupper. Не все макро имеют такой побочный эффект. Для определения существования побочного эффекта нужно перед использованием макро подробно рассмотреть его определение.


Include-файлы

Большинство процедур Си используют макро, определения констант и типов. Они задаются в отдельных include-файлах. Чтобы использовать библиотечные процедуры, необходимо соединить специальный #include-файл (используя директиву препроцессора #include) с компилируемым исходным файлом. Содержимое каждого include-файла различно и зависит от специфики процедур. В общем include-файлы содержат комбинации следующих величин:

Определений манифестных констант.

Например, константы BUFSIZЕ, определяющей размеры буфера для операций буферизованного ввода/вывода. Сама константа определяется в include-файле <stdio.h>.

Определений типов.

Некоторые процедуры Си требуют в качестве аргументов структуры данных или возвращают значения структурных типов. В include-файлах задаются объявления этих структур. Например, большинство операций потокового ввода/вывода используют указатели на структуру типа FILE, объявленную в файле <stdio.h>.


Дата добавления: 2019-09-13; просмотров: 207; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!