Я пытаюсь понять конкретную функцию указателя и назначения - PullRequest
2 голосов
/ 27 мая 2019

Я читаю исходный код видеоигры «Восстание триады: Темная война», и я наткнулся на строку кода Я не понимаю.

void (*USL_MeasureString)(char *, int *, int *, font_t *) = (void (*)(char *, int *, int *, font_t *))VW_MeasurePropString, (*USL_DrawString)(char *) = VWB_DrawPropString;

Насколько я понимаю, void (*USL_MeasureString)(char *, int *, int *, font_t *) означает, что *USL_MeasureString - это указатель на функцию, который принимает char *, int *, int *, font_t * в качестве параметров и ничего не возвращает из-за void.

Но затем я запутался в остальномкода.

Что именно это означает?

С уважением.

1 Ответ

4 голосов
/ 27 мая 2019

Давайте разберем эту длинную линию на три части:

void
  (*USL_MeasureString)(char *, int *, int *, font_t *) = (void (*)(char *, int *, int *, font_t *))VW_MeasurePropString,
  (*USL_DrawString)(char *) = VWB_DrawPropString;

Полагаю, теперь это легче понять. Как вы правильно поняли, USL_MeasureString определяется как указатель на функцию, а RHS (правая сторона) назначения - это приведение типа, примененное к слову VW_MeasurePropString.

Вторая часть сама по себе кажется сложной, но как только вы узнаете, как работает следующая строка, вы поймете, что она такая же:

char (*a) = (char *)"123", (*b) = "xyz";

Здесь и a, и b являются указателями на char, поэтому вы можете думать о char как о «базовом типе» для всей строки определений переменных. И, конечно, вы можете переписать его как:

char (*a) = (char *)"123";
char (*b) = "xyz";

Таким образом, часть после запятой в вашем исходном коде может быть переписана как (где void - «базовый тип»):

void (*USL_DrawString)(char *) = VWB_DrawPropString;

Как видите, это просто определение другого указателя на функцию с другим списком аргументов и без приведения типов.

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