我正在尝试了解特定的函数指针和赋值

时间:2019-05-27 13:02:09

标签: c function-pointers

我正在阅读视频游戏“黑社会的崛起:黑暗战争”的源代码,但遇到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而没有返回任何内容。

但是随后,我对其余的代码感到困惑。

这到底是什么意思?

最诚挚的问候。

1 个答案:

答案 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";

在这里,ab都是指向char的指针,因此您可以将char视为整个变量定义行的“基本类型”。当然,您可以将其重写为:

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

因此,原始代码中逗号后的部分可以重写为(其中void是“基本类型”):

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

如您所见,它只是具有不同参数列表且没有类型转换的另一个函数指针的定义。