Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
81
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

10.5 Указатель на функцию

С функцией можно делать только две вещи: вызывать ее и определять ее адрес. Указатель, хранящий адрес функции, можно использовать для вызова этой функции.

Пример. Объявление двух указателей на функции.

int (*psum)(int, int);

void (*pfun)(char*);

Если в программе определена какая-нибудь функция, например

Void error(char* p) { /*тело ф-ции*/} ,

то ее адрес можно поместить в указатель

pfun = &error;

а затем использовать его для вызова функции error

(*pfun)(“ошибка!”);

Поскольку операция вызова функции ( ) имеет приоритет выше, чем операция разыменования, необходимы скобки (*pfun).

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

pfun(“ошибка!”); означает то же что (*pfun)(“ошибка!”);

З а д а ч а. Определите функцию, которая с каждым элементом вещественного массива выполняет действие, заданное функцией-параметром.

Р е ш е н и е.

#include<math.h>

void for_each(double *M, int n, double fun(double))

{

for (int i=0; i<n; i++) M[i]=fun(M[i]);

return;

}

char b[100];

void main( ) {

double M[5] = {1, 2, 3, 4, 5};

for_each(M, 5, sin);

}

10.6 Спецификатор inline

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

Inline void error(char* p) { /*тело ф-ции*/}

Это может увеличить быстродействие программы.

З а м е ч а н и е. Если тело функции расположено в одной строке с заголовком, спецификатор inline можно не писать.

10.7 Макросы

Простой макрос определяется так.

#define NAME rest of line

Когда в тексте программы встречается лексема NAME, она заменяется словами rest of line. Эта замена (расширение макроса) выполняется до трансляции программы.

Макрос может занимать несколько строк, в этом случае знаком переноса служит обратная косая черта.

Можно определить макрос параметрами. Например,

#define MAC(a,b) a and b are parameters

При вызове MAC его параметрами должны быть две строки.

MAC(нечто, что-нибудь)

При расширении они заменят параметры макроса.

нечто and что-нибудь are parameters

Аргументу макроса может предшествовать оператор “#”, который после расширения превращает аргумент макроса в строку. Как любая строка, результат этой операции может объединяться с соседними строками.

Пример.

#define LEN(x) strlen(#x)

Макрос LEN(12345) расширяется в strlen(“12345”)

Оператор склейки “##” объединяет в одну две лексемы, между которыми он находится.

Пример. Определение макроса, создающего имена переменных.

#define DEF_VAR(n) int_var_ ## n

Макрос DEF_VAR(1) расширяется в int _var_1

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

З а д а ч а. Определить макросы выделения старшего и младшего байта слова.

Р е ш е н и е.

#define LOBYTE(w) (char(w))

#define HIBYTE(w) (char((unsigned)(w)>>8))

Макросы позволяют создать эффективный код, но затрудняют отладку. Вместо сложных макросов следует пользоваться встроенными функциями (inline), а вместо простых — символическими константами (const) и нумераторами (enum).

Вопросы

1. Где устанавливается значение параметра, заданного по умолчанию ?

2. Что означает многоточие в списке параметров функции?

3. Какими макросами обрабатывают нефиксированные параметры функции ?

4. Где определены эти макросы?

5. Каково назначение неиспользуемых параметров функции?

6. Что такое перегруженная функция?

7. Объявите указатель на целую функцию двух вещественных аргументов.

8. Объявите тип “указатель на целую функцию двух вещественных аргументов”.

9. Какова цель спецификации inline?

10. Как определить макрос с параметрами?

11. Что означает операция #?

12. Что означает операция ##?

13. Как отменить определение макроса?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]