#include <stdio.h>
typedef int Myfunc(int);
Myfunc
- название типа; это функция, принимающая аргумент int
и возвращающая int
.
typedef int (*point_to_myfunc)(int);
point_to_myfunc
является указателем на функцию принимает int
аргумент и возвращающая int
. Вы также можете: typedef Myfunc *ptr_to_myfunc;
, если хотите (другое имя для одного и того же типа).
static Myfunc example;
Это говорит: "существует функция называется example
типа Myfunc
.
static int example(int a)
{
printf("example a=%d\n", a);
return 1;
}
Это возможная реализация example
. Вы не можете использовать имя typedef как Myfunc
в определении функции этого типа.
static void example2(Myfunc *f)
{
printf("example2\n");
f(2);
}
Это функция, которая принимает указатель на Myfunc
. Строка f(2);
вызывает функцию, указанную аргументом 2, и игнорирует возвращаемое значение.
static void example3(int (*)(int));
example3
Объявляет как функция принимает указатель на функцию, которая принимает int
аргумент и возвращает int
результат. Он может быть написан как static void example3(point_to_myfunc);
или static void example3(ptr_to_myfunc);
или static void example3(Myfunc *);
.
static void example3(int (*point_to_Myfunc)(int))
{
printf("example3\n");
point_to_Myfunc(3);
}
Это реализация example3
.
int main(void)
{
point_to_myfunc f = &example;
example2(f);
example3(f);
return 0;
}
Эта программа имеет переменную f
это указатель на функцию. Интересно, что вы могли бы:
point_to_myfunc f2 = example;
point_to_myfunc f3 = *example;
И т. Д. И все они означают одно и то же.
Вы также можете вызвать их с помощью:
(*f2)(101);
(**f3)(103);
Стандартное обозначение для инициализации будет использовать ни &
, ни *
. Если вы старый программист C программы, вы можете вызвать указатель функции, используя нотацию (*f2)(101)
; до стандарта C89, это был единственный способ вызвать указатели на функции. Современный стиль обычно составляет f2(101);
.
Является ли 'typedef int Myfunc (int);' даже законным? – Shoe
@Jueecy Почему бы и нет? Это имеет очень очевидное значение, так почему бы Стандарт не разрешить это? если вы хотите узнать, является ли typedef законным, просто удалите «typedef» и посмотрите, является ли это юридическим объявлением. 'int MyFunc (int);' ... yup. –