Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

Typedef для переменной - C++
Добрый день. Есть примерно такая переменная:myScruct.someVal.val.objectЯ все это длинное и неудобное безобразие хочу обозначить...

Для чего typedef struct - C++
Часто в "профессиональном" коде вижу - typedef struct MyStruct { // ... } MyStuct; даёт ли это какие то преимущества перед...

Для чего используют typedef? - C++
Здравствуйте программисты! Набрёл на тему,там используется какой-то typedef, подскажите пожалуйста,что это такое,как с ним работать. И...

Как правильно пользоваться typedef для декларации типа указателя на функцию? - C++
Мне нужны будут функции, принимающие параметр-указатель на функции с одним и тем же списком параметров и возвращаемым типом. Как правильно...

typedef - C++
Доброго времени суток, уважаемые программисты! Не могу понять несколько строк из примера учебника Дейтела. С первой строкой все понятно,...

typedef - C++
Сталкнулся с таким объвлением typedef __mpz_struct mpz_t; Не могу врубится что оно значит? ...

8
HelicopterK52
682 / 208 / 28
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
02.09.2016, 11:28 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от p0jit0h Посмотреть сообщение
Если они нужны то почему я потом могу сделать следующее объявление
ну так у Вас функция a возвращает указатель на функцию, которая принимает int и возвращает void.
1
Operok
166 / 164 / 46
Регистрация: 15.02.2015
Сообщений: 480
Завершенные тесты: 2
02.09.2016, 11:33 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Тип указателя на функцию это по сути сигнатура этой функции, и выделенные аргументы это часть сигнатуры. В первом случае SIG_TYP - указатель на функцию принимающую параметр типа int и возвращающую значение типа void (ничего не возвращает), во втором случае CFT - указатель на функцию принимающую два параметра типа const void* и возвращающую значение типа int.
C++
1
SIG_TYP a(void x, char y);
- компилятор, наверное, это определит как объявление прототипа функции a, принимающей два параметра типа void и char и возвращающая указатель на функцию (тип SIG_TYP), но это смотря где такой код написать
1
p0jit0h
93 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 15
02.09.2016, 12:09  [ТС] #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);
0
Operok
166 / 164 / 46
Регистрация: 15.02.2015
Сообщений: 480
Завершенные тесты: 2
02.09.2016, 12:31 #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);
}
2
p0jit0h
93 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 15
02.09.2016, 12:53  [ТС] #6
Да, это хорошее использование typedef. Но что на самом деле происходит когда мы пишет скажем func_t a (char x); как компилятор это интерпретирует

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

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

Не по теме:

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

0
notAll
434 / 156 / 38
Регистрация: 27.05.2016
Сообщений: 419
Завершенные тесты: 2
02.09.2016, 13:04 #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 эквивалентны.
0
HelicopterK52
682 / 208 / 28
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
02.09.2016, 15:30 #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
0
02.09.2016, 15:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2016, 15:30
Привет! Вот еще темы с ответами:

Typedef - C++
Наткнулся на пример ниже: typedef char *cstring; //Каков тип переменной cstr в следующем объявлении: const cstring cstr; ...

typedef - C++
double f(double x){ } typedef double (*TPF)(double); TPF fff = f; fff(10.0); как и почему это работает корректно, если в...

Typedef - C++
Доброго времени суток. Привожу вам отрывок из книги &quot;C и Visual C++ 2008 для начинающих&quot;. В книге приведен пример объявления структуры с...

typedef в c++ - C++
Здравствуйте! Нужно собрать полную информацию по оператору typedef в c++. Пока нашел, что typedef используется для задания новых...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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