C表达式是什么((void(*)(void))0)(); 意思?

((void(*)(void))0)();

所以我们有整数0类型转换到这个棘手的类型(void(*))(void)然后执行它。 消息来源声称这应该有效,但它实际上是什么?

我认为这必须是像#define TRUE FALSE这样的C笑话之一。

这是一个期望没有参数并且不返回任何值的函数:

 void f(void) 

这是一个指向函数的指针,该函数不需要参数并且不返回任何值:

 void (*p)(void) 

这是该指针的类型

 void (*)(void) /* just remove the p! */ 

这是括号中的类型:

 (void (*)(void)) 

这是对该类型的强制转换(括号中的类型,后跟一个值):

 (void (*)(void))0 

还在我这儿? 到目前为止,我们有一个整数值0强制转换为指向函数的指针 – 不带参数 – 并且不返回任何内容。

强制转换是一个带有指针到函数类型的表达式。 当你有其中一个你可以这样称呼它:

 (your expression here)(arguments to the function) 

第一组括号仅用于优先级,有时可能不需要(但这次它们是)。 最终结果:

 ((void (*)(void))0)(/* no args */); 

取值0,将其转换为指向函数的指针 – 期望 – 无参数 – 并且不返回任何内容,并调用它,不提供任何参数。

将地址强制转换为函数指针然后调用它的语法如下所示:

 ((void (*)(void))address)(); 

这样做可能更清楚:

 void (*fptr)(void) = (void (*)(void))address; fptr(); 

((void(*)(void))0)(); 指令通常用于在固件中跳转到0。 它有点不合适,因为它实际上调用0而不是跳到0,但实际上它不会有任何区别(将执行fw热重启)

这将NULL视为函数指针并执行它,它应该在大多数系统上引发一个sigbus或类似的东西。

 void(*)(void) <- type, function pointer taking no arguments and returning no value (void(*)(void)) <- cast to above type ((...)0) <- cast NULL/0 to said type ((...)0)() <- execute the cast value as a function 

在某些嵌入式系统(例如AVR微控制器)上,这可能是一种向复位向量实现跳转(实际上是一次调用)的方法。

您可以通过这种方式重新启动SW,尤其是在此之前已禁用中断的情况下。

AVR通常会在地址0加载用户应用程序。一个加载到更高地址的引导加载程序可能跳转到(调用函数)地址0.因此,转换和调用0地址是有用的在这种环境中构建。