С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/30: Рейтинг темы: голосов - 30, средняя оценка - 4.57
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
1

typedef и указатель на функцию

26.12.2012, 19:18. Просмотров 5915. Ответов 16
Метки нет (Все метки)

Здравствуйте! Помогите пожлауйста с пониманем одного момента...

Так вот, есть оператор typedef.Он насколько я понял, обьявляет синоним.Напрмер:
C++
1
2
typedef int my;
my up;
То есть my==int, и мы создали переменную типа int.Это понятно.

Далее, у нас есть прототип функции void func(int*,int*), указателем на эту функцию, как я понимаю, будет void (*func)(int*,int*).

Так вот, вопрос - как запихнуть указатель на функцию в typedef, чтобы потом я мог обьявляь переменные с типом указатель на функцию с коротким именем.
В книге есть пример:
C++
1
2
typedef void(*func)(int*,int*);
func p1;
Но я не понимаю этот пример - мы же в typedef запихнули только заменяемое вроде, а на что оно заменяется, мы не написали.Но всё это работает.

Вообщем, вопросов очень много касательно этой темы.Если можно, обьсните подробно данную тему.Заранее благодарю
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2012, 19:18
Ответы с готовыми решениями:

Записать указатель на функцию, не используя typedef
Имеется переменная - указатель на функцию fptr. Написать эту же переменную...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось...

Указатель на шаблон класса через typedef
Здравствуйте. Возникла следующая проблема: захотел определить указатель на...

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
Друзья! Всем привет. Вот код: class otets { public: void f (void...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть...

16
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
26.12.2012, 19:31 2
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
Но я не понимаю этот пример - мы же в typedef запихнули только заменяемое вроде, а на что оно заменяется, мы не написали.Но всё это работает.
Мы запихнули идентификатор func.
0
Avazart
Эксперт С++
7761 / 5666 / 555
Регистрация: 10.12.2010
Сообщений: 25,688
Записей в блоге: 17
26.12.2012, 19:33 3
Я тоже часто теряюсь от такого синтаксиса
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
typedef void(*func)(int*,int*);
тут как бы
Код
func  ==  void xxx (int*,int*);
1
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
26.12.2012, 19:37  [ТС] 4
go, а почему тогда нельзя писать
C++
1
typedef void(*)(int*,int*) func;
Добавлено через 3 минуты
Avazart, поподробнее пожалуйста расскажите про ваш пример
0
Avazart
Эксперт С++
7761 / 5666 / 555
Регистрация: 10.12.2010
Сообщений: 25,688
Записей в блоге: 17
26.12.2012, 19:37 5
А кто его знает, такую нелогичность - наверное так было проще реализовать.
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
26.12.2012, 19:39 6
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
go, а почему тогда нельзя писать
Потому, что typedef это не простая подстановка. Почитайте про синтаксис, чтобы не путаться. Не путайте с define.
1
prazuber
111 / 111 / 13
Регистрация: 29.04.2010
Сообщений: 240
26.12.2012, 19:41 7
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
go, а почему тогда нельзя писать
C++
1
typedef void(*)(int*,int*) func;
А почему нельзя писать так?
C++
1
void (*)(int*,int*) func;
Или так:
C++
1
void ()(int*,int*) func;
Здесь проблема не в typedef, а в синтаксисе объявления указателя на функцию, с которым вам придется мирится.

Запомните главное правило - синтаксис typedef точно так же, как и синтаксис обычного объявления переменной без typedef'а.
4
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
26.12.2012, 19:55 8
ZaMaZaN4iK, http://msdn.microsoft.com/ru-ru/library/4x7sfztk.aspx почитай.

Цитата Сообщение от prazuber Посмотреть сообщение
Запомните главное правило - синтаксис typedef точно так же, как и синтаксис обычного объявления переменной без typedef'а.
Не правда. Вот смотрите. Я объявил
C++
1
2
3
4
typedef char* pChar;
 
const pChar a, b, c; // Замените это, как это поймет компилятор, 
// т.е. уберите typedef и сохраните смысл этого объявления :)
3
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
26.12.2012, 19:58  [ТС] 9
go, может я ошибаюсь, но должно получиться как-то так:
C++
1
const char *a,*b,*c;
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
26.12.2012, 20:00 10
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
go, может я ошибаюсь, но должно получиться как-то так:
Нет. Поэтому должны быть typedef'ы как для неконстантных вариантов указателей, так и для константных.
0
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
26.12.2012, 20:03 11
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
Так вот, есть оператор typedef.Он насколько я понял, обьявляет синоним.
Нет. typedef объявляет новый тип, как type на паскале. Можно его юзать и для создания синонимов, но его возможности несопоставимо шире.
0
Avazart
Эксперт С++
7761 / 5666 / 555
Регистрация: 10.12.2010
Сообщений: 25,688
Записей в блоге: 17
26.12.2012, 20:05 12
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет. typedef объявляет новый тип, как type на паскале. Можно его юзать и для создания синонимов, но его возможности несопоставимо шире.
Да нет не новый.. typeid проверьте...
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
26.12.2012, 20:07 13

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
typedef объявляет новый тип, как type на паскале.
Да ладно :)



Добавлено через 1 минуту
taras atavin, вот синтаксис
Код
typedef type-declaration synonym;
0
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
26.12.2012, 20:09 14
А как же тогда указательные типы, в том числе, на функции?
0
Avazart
Эксперт С++
7761 / 5666 / 555
Регистрация: 10.12.2010
Сообщений: 25,688
Записей в блоге: 17
26.12.2012, 20:14 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <typeinfo>
//----------------------------------
int main()
{
typedef int my;
 
std::cout <<  typeid(int).name() << std::endl;
std::cout <<  typeid(my).name() << std::endl;
 
return 0;
}
Добавлено через 31 секунду
Цитата Сообщение от taras atavin Посмотреть сообщение
А как же тогда указательные типы, в том числе, на функции?
А что с ними ?
0
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
26.12.2012, 20:15 16
Так здесь то синоним.

Добавлено через 48 секунд
Цитата Сообщение от Avazart Посмотреть сообщение
А что с ними ?
Ну в синтаксис декларации синонимов они ни как не лезут, хоть копром забивай.
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
26.12.2012, 20:21 17
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну в синтаксис декларации синонимов они ни как не лезут, хоть копром забивай.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <typeinfo>
 
typedef void (my)(int);
 
void m(int);
 
int main()
{
    std::cout <<  typeid(m).name() << std::endl;
    std::cout <<  typeid(my).name() << std::endl;
    std::system("pause");
    return 0;
}
0
26.12.2012, 20:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2012, 20:21

Передача умного указателя в функцию принимающую указатель на указатель
Итак имеется функция со следующим параметром: HRESULT __stdcall...

Как объявить указатель на массив через typedef и как инициализировать такой тип
Как заставить заработать этот фрагмент кода? INT_L -- указатель на массив из...

Typedef перед указателем на функцию
Есть функция int func(int, int). Указатель на функцию int (*pointer)(int, int)....


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

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

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