вот как-то считал, что
typedef что-то там cap;
равносильно
#define cap что-то там;
однако страуструп цитатой
typedef void (*SIG_TYP)(int);
typedef void (*SIG_ARG_TYP)(int);
SIG_TYP signal(int, SIG_ARG_TYP);
убил меня наповал. я понял, что что-то я неправильно считал. может мне
кто-нибудь объяснить, где я запутался и как разворачивается третья строка
цитаты, или хотя бы подсказать, где можно найти объяснение?
Valera
VK> вот как-то считал, что
VK> typedef что-то там cap;
VK> равносильно
VK> #define cap что-то там;
Hе равносильно, разумеется.
VK> однако страуструп цитатой
VK> typedef void (*SIG_TYP)(int);
VK> typedef void (*SIG_ARG_TYP)(int);
VK> SIG_TYP signal(int, SIG_ARG_TYP);
VK> убил меня наповал. я понял, что что-то я неправильно считал. может мне
VK> кто-нибудь объяснить, где я запутался и как разворачивается третья строка
VK> цитаты, или хотя бы подсказать, где можно найти объяснение?
Да нет тут никакого особого объяснения. typedef заводит имя-псевдоним для
некоторого типа. Вот, собственно и все. После этого, в частности, все
квалификаторы, применяемые к этому имени-псевдониму, относятся ко всему типу.
Отличий от #define можно привести целый ворох. Hапример
typedef int* T;
#define D int*
...
T a, b; /* и 'a', и 'b' имеют тип 'int*' */
D c, d; /* 'c' есть 'int*', но 'd' - просто 'int' */
const T e; /* 'e' есть 'int* const' */
const D f; /* 'f' есть 'const int*' */
Твой пример выше раскручиваетися соответствующим образом. Только смысла в этом
мало, ибо станет совсем нечитаемо.
Подставим сначала 'SIG_ARG_TYP':
SIG_TYP signal(int, void (*)(int));
а затем 'SIG_TYP':
void (*signal(int, void (*)(int)))(int);
Вот и все.
Best regards, Андрей