Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про применение Typedef для функций 
:(
    Опции темы
Robix
Дата 28.5.2015, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



Здравстуйте, есть такой код

Order.h
...
typedef void __stdcall ORDER_CALLBACK( PORDERHDR porder, int extra_data );
typedef                ORDER_CALLBACK  *PORDER_CALLBACK;
...

Order.cpp
...
#include "Order.h"
...
ORDER_CALLBACK orderCallback;
...

Можете объяснить, что означает 
typedef void __stdcall ORDER_CALLBACK( PORDERHDR porder, int extra_data );
Что в данном случае есть ORDER_CALLBACK ? 

И далее в Order.cpp
ORDER_CALLBACK orderCallback;
orderCallback это будет функция или что-то еще? Как это понимать?




PM MAIL   Вверх
baldina
Дата 28.5.2015, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



функция. такой typedef дает возможность сделать краткую декларацию, например
Код

class A {
  typedef void F ();
  virtual F f1 = 0;
  F f2;
};

void A::f2() {}
см. http://ideone.com/7fUoOP

PM MAIL   Вверх
borisbn
Дата 29.5.2015, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Есть такой тип в Си - указатель на функцию. Чаще всего его используют, чтобы передать в какую-то чужую функцию свою функцию, которую чужая будет вызывать (т.н. callback'и). Например, некая сетевая библиотека умеет передавать и принимать по сети данные, но что при получении данных с ними делать она не знает, и, поэтому, она требует, чтобы тот, кто ею пользуется, указал свою функцию, которую сетевая библиотека будет вызывать при приёме данных.
Код
class NetLib {
...
   void setCallBackOnDataReceived( void (*callback)( void * data, int dataSize ) ) {
        onDataReceived = callback;
   }

   void receiveData() {
         void * data = ...;
         int dataSize = ...;
        onDataReceived( data, dataSize );
   }
private:
   void (*onDataReceived)( void * data, int dataSize );
};

Как видишь, определение переменной onDataReceived и сигнатура функции setCallBackOnDataReceived довольно громоздкие, и при изменении количества или типов параметров в callback'е придётся менять в нескольких местах. Чтобы этого избежать мы можем ввести typedef для типа "указатель на функцию, принимающую void * и int и возвращающую void". На Си это будет выглядеть так:
Код
typedef void (*onDataReceived_t)( void * data, int dataSize );

и код в примере выше будет выглядеть почище:
Код
class NetLib {
...
   typedef void (*onDataReceived_t)( void * data, int dataSize );
   void setCallBackOnDataReceived( onDataReceived_t callback ) {
        onDataReceived = callback;
   }

   void receiveData() {
         void * data = ...;
         int dataSize = ...;
         onDataReceived( data, dataSize );
   }
private:
   onDataReceived_t onDataReceived;
};

Теперь при изменении параметров callback'а нужно будет только поправить определение типа onDataReceived_t и, собственно, вызов самого callback'а.

Добавлено через 6 минут и 40 секунд
Цитата(Robix @  28.5.2015,  16:03 Найти цитируемый пост)
Что в данном случае есть ORDER_CALLBACK ? 

ORDER_CALLBACK - это тип, в экземпляре которого может храниться указатель на функцию, принимающую два параметра, ничего возвращающую и имеющую тип вызова __stdcall.
Цитата(Robix @  28.5.2015,  16:03 Найти цитируемый пост)
orderCallback это будет функция или что-то еще?

orderCallback - это экземпляр типа ORDER_CALLBACK. Пока он не проинициализирован каким-то указателем на функцию, использовать его нельзя (так же, как и с обычными указателями).


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
baldina
Дата 29.5.2015, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



замечаете разницу?
Код

typedef void (*onDataReceived_t)( void * data, int dataSize );
// vs
typedef void (  onDataReceived_t)( void * data, int dataSize );


так что
Цитата(borisbn @  29.5.2015,  13:03 Найти цитируемый пост)
ORDER_CALLBACK - это тип, в экземпляре которого может храниться указатель на функцию
...
orderCallback - это экземпляр типа ORDER_CALLBACK. Пока он не проинициализирован каким-то указателем на функцию...

неверно

потому что 
Цитата

A typedef of function type may be used to declare a function but 
shall not be used to define a function (8.4).
[Example:
typedef void F();
F fv; // OK: equivalent to void fv();
F fv { } // illformed
void fv() { } // OK: definition of fv
end example]


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.