Тип возврата в случае функций обратного вызова - PullRequest
0 голосов
/ 26 апреля 2018

Я просматриваю устаревший код моей кодовой базы и обнаружил следующий фрагмент кода:

void *sampleFunction(tUint8 **inParam1, tUint32 inParam2, char *inParam3, tUint32 inParam4, void* inArg1, void* inArg2)
{
    X100 *foo = getFooValue(...);
    return foo;
}

Поскольку я не могу опубликовать точный код (поскольку он связан с работой), я опубликовалПриведенный выше пример (именно так он и выглядит).

X100, показанный здесь, представляет собой структуру, которая содержит некоторые данные и, как показано ниже, есть функция обратного вызова, которой она назначена (или чтовот как это выглядит для меня)

typedef void* (*tFileReadVerifyCallback)((tUint8 **inParam1, tUint32 inParam2, char *inParam3, tUint32 inParam4, void* inArg1, void* inArg2);

tFileReadVerifyCallback callBack;

//for a certain case :
callBack = sampleFunction;

Теперь у меня есть следующие вопросы:

  1. Почему sampleFunction возвращает foo типа X100?Это потому, что обратные вызовы ведут себя по-разному?
  2. Если так, то мой следующий вопрос будет состоять в том, как работают эти обратные вызовы / как на это влияет возвращаемое значение?

ПРИМЕЧАНИЕ. Я пытался предоставить достаточно информации, стараясь, чтобы она была минимальной.Если потребуется больше информации, пожалуйста, дайте мне знать, я постараюсь отредактировать ее и добавить дополнительную информацию.

1 Ответ

0 голосов
/ 26 апреля 2018

Почему sampleFunction возвращает foo типа X100?

Нет, возвращается foo, который является X100 *, указателем объекта,Указывается, что обратный вызов возвращает void *, и все указатели объектов могут быть преобразованы в void *.Обратный вызов не является чем-то особенным.

void * обычно используется для такого типа стирания типа, чтобы позволить функции возвращать «что-нибудь».Вы видите, что он используется в обратных вызовах, потому что цель состоит в том, чтобы позволить клиентскому коду возвращать любой указатель объекта, который им может понравиться.

Конечно, при возврате указателей на произвольные объекты возникает важный вопрос: "когда это должно произойти?объект будет освобожден, если вообще? " Ответ на этот вопрос зависит от библиотеки, которая принимает обратный вызов, и от того, как она документирует свое взаимодействие с ним.

...