Давайте разберем эту длинную линию на три части:
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;
Как видите, это просто определение другого указателя на функцию с другим списком аргументов и без приведения типов.