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