Может кто-нибудь объяснить, что int ((*foo(int)))(int)
в этом делает?
int (*fooptr)(int);
int ((*foo(int)))(int); // Can't understand what this does.
int main()
{
fooptr = foo(0);
fooptr(10);
}
.
Может кто-нибудь объяснить, что int ((*foo(int)))(int)
в этом делает?
int (*fooptr)(int);
int ((*foo(int)))(int); // Can't understand what this does.
int main()
{
fooptr = foo(0);
fooptr(10);
}
.
int ((*foo(int)))(int);
Это объявляет foo
как функцию, которая ожидает аргумент типа int
и возвращает указатель на функцию, которая ожидает аргумент типа int
и возвращает int
.
Чтобы быть более ясным:
foo -- foo
foo( ) -- is a function
foo(int) -- taking an int argument
*foo(int) -- returning a pointer
(*foo(int))( ) -- to a function that
(*foo(int))(int) -- takes an int argument
int (*foo(int))(int) -- and returning an int
Здесь является хорошим объяснением того же.
foo
- это то, что мы объявляем.
foo(int)
Это функция, которая принимает один аргумент int
*foo(int)
и возвращает указатель
((*foo(int)))(int)
к функции, которая принимает один аргумент int
int ((*foo(int)))(int)
и возвращает int
.
Одна пара ()
является избыточной. То же самое можно выразить как
int (*foo(int))(int)
Там уже ответы на это, но я хотел подойти к нему обратным образом.
Объявление функции выглядит так же, как объявление переменной, за исключением того, что имя переменной заменяется именем функции и параметрами.
Итак, это объявляет bar
как указатель на функцию, которая принимает int
и возвращает int
:
int (*bar)(int);
Если вместо переменной bar
это функция foo(int)
с этим возвращаемым значением, вы заменяете bar
на foo(int)
и получаете:
int (*foo(int))(int);
// ^^^^^^^^
// this was "bar" before
Добавьте ненужную пару круглых скобок, и вы получите:
int ((*foo(int)))(int);
// ^ ^
// extra parentheses
Согласно cdecl, foo
:
declare foo as function (int) возвращающий указатель на функцию (int), возвращающую int