我正在阅读视频游戏“黑社会的崛起:黑暗战争”的源代码,但遇到a line of code我不理解。
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
而没有返回任何内容。
但是随后,我对其余的代码感到困惑。
这到底是什么意思?
最诚挚的问候。
答案 0 :(得分:4)
让我们把这条长线分成三部分:
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;
如您所见,它只是具有不同参数列表且没有类型转换的另一个函数指针的定义。