рекурсивный тип возврата - PullRequest
1 голос
/ 21 декабря 2010

Я только что просмотрел дипломную работу Марка Пробста и наткнулся на следующий код:

typedef void* cont(void);

for (;;)
{
    cp = (cont*)(*cp)();
}

Я почти уверен, что актеры должны читать (cont), а не (cont*), потому что он объясняет:

Функция, желающая сделать правильный конечный вызов, возвращает адрес функции , которая будет вызвана

И cont - это уже тип указателя на функцию. Итак, давайте изменим эту строку на:

    cp = (cont)(*cp)();

Теперь мне было интересно, как мы можем избавиться от актеров? Можно ли определить cont, чтобы он возвращал cont? Как будет выглядеть typedef для cont? Нужен ли нам вспомогательный тип для достижения этой цели? Это невозможно?

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

Тип cont - это функция, возвращающая указатель void. Поэтому cont * является указателем на такую ​​функцию, и * не может быть удален из приведения.

1 голос
/ 21 декабря 2010

Нет, typedef void* cont(void); cont определяет тип функции, возвращающий void *.Я думаю, что вы путаете это с typedef void (*cont)(void); или typedef void *(*cont)(void);.

. Я не верю, что в этом сценарии можно устранить необходимость в приведении, но я открыт, чтобы быть уверенным в обратном.

...