typedef указателя на языке c - PullRequest
2 голосов
/ 25 июля 2011

У меня есть вопрос о typedef на языке c.Я прочитал следующий код:

typedef void* (*RT) (int a, int b);

что определено в этом примере?

Ответы [ 8 ]

6 голосов
/ 25 июля 2011

Я предлагаю вам использовать старый добрый "спиральный метод":

           +---------------------------------+
           |  +-------------------+          |
           |  |   +----+          |          |
           |  |   |    |          |          |
           V  V   V    |          |          |
 typedef void * ( * RT | ) (int a, int b);   |
              |   | |  |          ^          |
              |   | +--+          |          |
              |   +---------------+          |
              +------------------------------+

после строки, которую вы можете прочитать:

  • RT - это ...
  • указатель на ...
  • функция, возвращающая ...
  • указатель на ...
  • аннулируются

Вы начинаете с имени типа и двигаетесь поочередно вправо, а затем влево (с учетом скобок, как в примере).

4 голосов
/ 25 июля 2011
        RT                  // RT
      (*RT)                 // is a pointer to
      (*RT) (               // a function
      (*RT) (int a, int b); // taking two ints and returning 
    * (*RT) (int a, int b); // a pointer to
void* (*RT) (int a, int b); // void
4 голосов
/ 25 июля 2011

Это указатель на функцию, возвращающую void и принимающую два аргумента int.Имя типа: RT.

. Если у вас есть такие сомнения, очень полезным инструментом будет cdecl.org .

.
2 голосов
/ 25 июля 2011

См. cdecl:

declare RT as pointer to function (int, int) returning pointer to void
1 голос
/ 25 июля 2011

Это объявление создает RT в качестве имени определения типа (синоним) для типа "указатель на функцию, принимающий два параметра int и возвращающий указатель на void". Затем вы должны использовать RT для объявления объектов этого типа, например:

RT foo, bar;

вместо записи

void *(*foo)(int a, int b), *(*bar)(int a, int b);

или

void *(*foo)(int a, int b);
void *(*bar)(int a, int b);
1 голос
/ 25 июля 2011

Вы определяете указатель на функцию. RT это имя typedef, void* его тип возвращаемого значения и два раза int это типы аргументов функции.

1 голос
/ 25 июля 2011

RT - указатель на функцию, которая принимает в качестве аргументов два целых числа и возвращает void * (универсальный указатель).

0 голосов
/ 25 июля 2011

Это создаст определение типа для указателя функции на имя RT. Это часто используется для функций обратного вызова в библиотеках. Поэтому, когда требуются функции обратного вызова, подпись функции может быть записана более кратко с помощью *RT вместо полной подписи.

...