Код на самом деле неверный.Проблема в том, что эта строка:
int (*foo(bool))(int); // foo is &(bool→(int→int))
... не означает, что вы думаете, что это значит.Это интерпретируется как объявление функции с именем "foo".Это имеет смысл.Подумайте об этом - если бы вы хотели форвард объявить «baz», вы бы поставили int (*baz(bool))(int);
, верно?Кроме того, поскольку baz - это функция, которая возвращает указатель на функцию, а foo - это указатель на функцию, которая возвращает указатель на функцию, разве вы не ожидаете, что синтаксис будет более сложным?
Вы объявили foo какфункция того же типа, что и baz, а не указатель на функция того же типа, что и baz.
В вашем компиляторе сообщение об ошибке first являетсяполезный - он сообщает вам assignment of function
, т.е. вы пытались присвоить функции, что является ошибкой.
Я даже не собираюсь пытаться написать правильное решение без typedefs :-) Вот некоторый код, который компилируется, и я думаю, что это правильно, используя typedefs:
#include <stdlib.h>
#include <stdbool.h>
typedef int(*IntReturnsInt)(int);
int inc(int i) { return i+1; }
IntReturnsInt baz(bool b) { return b ? &abs : &inc; }
int main() {
IntReturnsInt (*foo)(bool b);
foo = baz;
}
В этом примереконцепция двойного указателя функции немного яснее - IntReturnsInt
- это тип указателя на функцию, а foo
- указатель на функцию, которая возвращает IntReturnsInt
... phew: -)