Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
p0jit0h
93 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 15
#1

Typedef для функций - C++

02.09.2016, 11:19. Просмотров 297. Ответов 8
Метки нет (Все метки)

Здравствуйте!
В книге Страуструпа в качестве примера приводится typedef для указателей на функции например:
typedef void(*SIG_TYP) (int) ,
typedef int (*CFT)(const void*, const void*)

Не совсем понятно на что влияют выделеные аргументы. Если они нужны, то почему я потом могу сделать следующее объявление:
C++
1
SIG_TYP a(void x, char y);
И компилятор это скомпилит без ошибок.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2016, 11:19     Typedef для функций
Посмотрите здесь:

Для чего используют typedef? C++
C++ Странности с typedef
typedef C++
typedef C++
typedef в c++ C++
C++ Для чего typedef struct
Typedef C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HelicopterK52
654 / 197 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
02.09.2016, 11:28     Typedef для функций #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от p0jit0h Посмотреть сообщение
Если они нужны то почему я потом могу сделать следующее объявление
ну так у Вас функция a возвращает указатель на функцию, которая принимает int и возвращает void.
Operok
139 / 137 / 40
Регистрация: 15.02.2015
Сообщений: 417
Завершенные тесты: 2
02.09.2016, 11:33     Typedef для функций #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Тип указателя на функцию это по сути сигнатура этой функции, и выделенные аргументы это часть сигнатуры. В первом случае SIG_TYP - указатель на функцию принимающую параметр типа int и возвращающую значение типа void (ничего не возвращает), во втором случае CFT - указатель на функцию принимающую два параметра типа const void* и возвращающую значение типа int.
C++
1
SIG_TYP a(void x, char y);
- компилятор, наверное, это определит как объявление прототипа функции a, принимающей два параметра типа void и char и возвращающая указатель на функцию (тип SIG_TYP), но это смотря где такой код написать
p0jit0h
93 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 15
02.09.2016, 12:09  [ТС]     Typedef для функций #4
Всё равно не могу разобраться. typedef, создан для определения своих типов.
C++
1
2
3
typedef int myint; // в последующем тип myint будет изменён (кстати интересно как, подобно макросом он просто подставит int)? 
typedef void(*SIG_TYP)(int)//в последующем тип SIG_TYP эквивалентен void *(int). То есть когда компилятор видит код типа
SIG_TYP a, Для него это эквивалентно void a(int);
Но тогда код SIG_TYP a(void x, char y); эквивалентный void a(int)(void x, char y) не имеет смысла.
Я скорее всего не понимаю как точно работает typedef, а в книге поэтому поводу объяснений ,не могу найти

Добавлено через 6 минут
void *a(int);
Operok
139 / 137 / 40
Регистрация: 15.02.2015
Сообщений: 417
Завершенные тесты: 2
02.09.2016, 12:31     Typedef для функций #5
SIG_TYP a; эквивалентен void (*a)(int);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
typedef void (*func_t)(int);
void func_inc(int x) { std::cout << ++x << std::endl; }
void func_square(int x) { std::cout << x*x << std::endl; }
 
int main()
{
    func_t func = func_inc;
    func(5);
    func = func_square;
    func(10);
}
p0jit0h
93 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 15
02.09.2016, 12:53  [ТС]     Typedef для функций #6
Да, это хорошее использование typedef. Но что на самом деле происходит когда мы пишет скажем func_t a (char x); как компилятор это интерпретирует

Добавлено через 7 минут
Возможно я разобрался.
SIG_TYP a(void x, char y) - функция возвращающая указатель на функцию вида void (*)(int)
SIG_TYP a - указатель на функцию вида void(*)(int)
Ведь так ?

Добавлено через 7 минут
Спасибо)
Operok
02.09.2016, 13:00
  #7

Не по теме:

Цитата Сообщение от p0jit0h Посмотреть сообщение
Спасибо)
на здоровье

notAll
382 / 103 / 21
Регистрация: 27.05.2016
Сообщений: 261
Завершенные тесты: 2
02.09.2016, 13:04     Typedef для функций #8
Цитата Сообщение от p0jit0h Посмотреть сообщение
что на самом деле происходит когда мы пишет скажем func_t a (char x); как компилятор это интерпретирует
Так:
C++
1
2
3
4
typedef void(*SIG_TYP) (int);
void foo(int) {}
SIG_TYP a(char y) {return foo;} 
void (*a2(char y))(int) {return foo;}
Добавлено через 1 минуту
Ф-ции a и a2 эквивалентны.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2016, 15:30     Typedef для функций
Еще ссылки по теме:

typedef C++
Как правильно пользоваться typedef для декларации типа указателя на функцию? C++
Typedef C++
Typedef для переменной C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
HelicopterK52
654 / 197 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
02.09.2016, 15:30     Typedef для функций #9
Цитата Сообщение от p0jit0h Посмотреть сообщение
как компилятор это интерпретирует
Можно без typedef:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
 
 
void bar(double x, double y)//функция bar возвращает void и принимает два значения типа double
{
    std::cout << x << "; " << y << std::endl;
}
 
 
//фукция foo принимает значение типа int и возвращает указатель на функцию,
//которая возвращает void и примает два значения типа double
void (*foo(int x))(double, double)
{
    return bar;//возвращаем указатель на функцию bar
}
 
 
 
int main()
{
    foo(10)(34.6, 81.7);//вызываем foo и через возвращаемый указатель стучимся к bar
}
http://rextester.com/OKSPA77516
Yandex
Объявления
02.09.2016, 15:30     Typedef для функций
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru