typedef
- это языковая конструкция, которая связывает имя с типом.
Вы используете ее так же, как и исходный тип, например
typedef int myinteger;
typedef char *mystring;
typedef void (*myfunc)();
используя их как
myinteger i; // is equivalent to int i;
mystring s; // is the same as char *s;
myfunc f; // compile equally as void (*f)();
Как видите, вы можете просто заменить имя typedefed на его определение, приведенное выше.
Сложность заключается в указателе на синтаксис функций и удобочитаемости в C и C ++, а typedef
может улучшить читаемость таких объявлений. Однако синтаксис является подходящим, поскольку функции - в отличие от других более простых типов - могут иметь возвращаемое значение и параметры, поэтому иногда длинное и сложное объявление указателя на функцию.
Читаемость может стать очень сложной с указателями на массивы функций и некоторыми другими, даже более косвенными разновидностями.
Чтобы ответить на ваши три вопроса
Почему используется typedef? Для облегчения чтения кода - особенно для указателей на функции или имен структур.
Синтаксис выглядит странным (в указателе на объявление функции). Этот синтаксис неочевиден для чтения, по крайней мере, в начале. Вместо этого использование объявления typedef
облегчает чтение
Создан ли указатель функции для хранения адреса памяти функции? Да, указатель функции хранит адрес функции. Это не имеет ничего общего с конструкцией typedef
, которая только облегчает запись / чтение программы; компилятор просто расширяет определение typedef перед компиляцией фактического кода.
Пример:
typedef int (*t_somefunc)(int,int);
int product(int u, int v) {
return u*v;
}
t_somefunc afunc = &product;
...
int x2 = (*afunc)(123, 456); // call product() to calculate 123*456
person
Breaking not so bad
schedule
28.11.2010
using FunctionFunc = void (*)();
. Немного яснее, что вы просто объявляете имя для типа (указатель на функцию) - person user362515   schedule 08.01.2016using FunctionFunc = void(void);
- person topspin   schedule 29.05.2016*
немного более явный. - person user362515   schedule 31.05.2016