typedef двух разных указателей на функции действителен? - PullRequest
0 голосов
/ 30 января 2019

Может ли кто-нибудь объяснить, что именно означает код, и действительно ли это правильно, если сделать typedef подобным образом и использовать "name" в аргументах вызова функции?

typedef uint8 (*Funcptr) (name);
typedef uint8 (*Funcptr1) (name);

typedef struct {
    Funcptr func;
    Funcptr1 func_1;
} a;

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Да, это допустимо при условии, что uint8 и name являются типами, которые были определены ранее.

Объявление typedef uint8 (*Funcptr) (name); говорит, что Funcptr является типом для указателя на функцию, котораяпринимает name в качестве аргумента и возвращает uint8.

В общем случае объявление C, такое как uint8 (*Funcptr) (name), дает тип (в данном случае uint8) и образец выражения (в этомcase (*Funcptr) (name)) и означает «Когда я использую Funcptr таким образом, выражение имеет тип uint8.Итак, мы имеем:

  • (*Funcptr) (name) - это uint8.
  • Следовательно, (*Funcptr) должна быть функцией, принимающей name и возвращающей uint8.
  • Следовательно, Funcptr должен быть указателем на функцию, принимающую name и возвращающую uint8.

Тогда, поскольку это typedef, мы знаемчто Funcptr - это имя этого типа, а не объект, который является указателем на функцию, принимающую name и возвращающую uint8.

0 голосов
/ 30 января 2019

Есть указатель на функцию, возвращающую uint8 и получающую имя в аргументе (возможно, другой typedef или недопустимый, если не определено)

Пример:

typedef char * name; /* added to be able to compile */

typedef uint8 (*Funcptr) (name);

uint8 foo(name s)
{
  return 0;
}

int main()
{
  Funcptr f = &foo;
  char bar[] = "bar";

  (*f)(bar);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...