typedef void (* что-то) (someclass * что-то) - что это значит? Никогда не видел использование typedef, как это - PullRequest
1 голос
/ 08 декабря 2011

Я читаю код ядра Linux и сталкиваюсь с чем-то вроде следующего:

typedef void (* gps_location_callback)(GpsLocation* location)

, затем позже его можно использовать как:

gps_location_callback location_cb;

Может кто-нибудь сказать мне, что делаетчто typedef значит?Я никогда не видел ничего подобного раньше .. Спасибо!

Ответы [ 5 ]

5 голосов
/ 08 декабря 2011

Это указатель на функцию .Переменные этого типа указывают на функцию с сигнатурой void (GpsLocation*):

void foo(GpsLocation *);

gps_location_callback f = foo;

// now use f(p) etc

Без typedef вам нужно написать:

void (*f)(GpsLocation *) = foo;
3 голосов
/ 08 декабря 2011

Это делает gps_location_callback как typedef для функции, которая возвращает void и принимает GpsLocation* в качестве аргумента.

Так что каждый раз, когда вы используете руду, объявляйте переменную типа gps_location_callback, вы используете или объявляете указатель на функцию, которая указывает на функцию, которая возвращает void и принимает аргументы, перечисленные в typedef.

0 голосов
/ 18 февраля 2014

Это делает gps_location_callback псевдонимом указателя функции, который принимает GpsLocation* location в качестве аргумента и ничего не возвращая;

В этом typedef теперь легко сделать указатель на переменную функцию, как вы хотите, и вы используете это как

gps_location_callback x,y,z;

Теперь у вас есть три указателя функции, которые принимают аргумент как GpsLocation* location и ничего не возвращают.

0 голосов
/ 08 декабря 2011

gps_location_callback - это определение указателя на функцию , где функция ничего не возвращает (void) и принимает указатель на GpsLocation в качестве аргумента.

например. Если у вас была функция:

void location_func(GpsLocation* location)

Вы можете назначить указатель на функцию на location_cb, т. Е.

gps_location_callback location_cb = location_func;
0 голосов
/ 08 декабря 2011

это typedef для функции * это для выполнения обратных вызовов

, поэтому вы можете затем делать

if(location_cb != NULL)
{
    location_cb(my_gps_location);
}

обратные вызовы хороши для событий, основанных на событиях, это позволяет вам передавать функции во что-тоэто может быть вызвано, когда происходят события.например, когда вы приобретаете местоположение GPS, пожалуйста, вызовите мою функцию с приобретенным вами GPS, чтобы я мог сделать свое дело, например сохранить его в базе данных или отобразить на экране

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...