A.8 Препроцессор

Предыдущая  Содержание  Следующая V*D*V

ANSI-C больше не разворачивает #define рекурсивно; поэтому вызовы функций могут быть скрыты или упрощены макросами с теми же именами:

 

#define malloc(type) (type *) malloc(sizeof(type))

 

int * p = malloc(int);

 

Если определён макрос с параметрами, ANSI-C распознает такой вызов только если имя макроса появляется перед левой скобкой; поэтому распознавание макроса может быть подавлено в заголовке функции заключением имени такой функции дополнительным набором круглых скобок:

 

#include <stdio.h>                определяет putchar(ch) как макрос

 

int (putchar) (int ch) { ... }    имя не заменяется

 

По той же причине определение параметрического макроса больше не вступает в противоречие с переменной того же имени:

 

#define x(p) (((const struct Object *)(p)) -> x)

 

int x = 10;                       имя не заменяется

 

Предыдущая  Содержание  Следующая