'((void(*)())0x1000)();`是什么意思?
这里是一个代码,目的是设置程序计数器跳转到地址0x1000
。 我知道它做了什么,但我不明白如何。 这与我缺乏C语言知识有关。 可能是你可以开导我。 这里是声明/函数(我甚至不知道它是什么:))
((void (*)())0x1000)();
我的事情是指向一个返回void
和不接受任何参数的函数的指针。 如果我错了,请纠正我。
使用一个简单的规则从内部解码C
声明:从标识符开始,在右边检查[]
(array)或()
(function),然后在左边检查值的types(存储在数组或由函数返回),而不会交叉括号; 从括号中跳出并重复。
例如:
void (*p)()
p
是(没有在右边) 一个指针 (在左边,不要越过圆括号) 到 (转义括号,读下一个级别) 一个函数 (右) 不返回任何东西 (左)。
当标识符(在本例中为p
)缺失时,所有剩下的就是一个types声明。
放在括号内的types,放在一个值的前面是一个types转换。
(void (*)())0x1000
将数字0x1000
转换为指向不返回任何内容的函数的指针 (有关上面的p
声明的段落括号内的内容)。
在下一层,上面的expression式(一个指向函数的指针可以用和函数名相同的方式使用)来执行指向的代码。
看下面的整个expression去组成:
( ( void (*)() /* type: pointer to function that doesn't return anything */ )0x1000 /* value 0x1000 treated as a value of the type declared above */ ) /* enclose in parentheses to specify the order of evaluation */ (); /* the pointer above used as a function name to run the code */
(void (*)())
是一个指向返回void
的函数的指针,并且指定了一个未指定但固定数量的参数。
(void (*)())0x1000
正在将文字0x1000
强制转换为上述types。
最后是后缀()
调用函数。 前面的expression式需要在括号中,否则后缀()
将绑定到0x1000
,这在语法上是不合法的。
这是由你来检查铸造是否真的有效。 如果没有,那么你的程序的行为是不确定的 。
一个常数
0x1000
被投射到一个types:
(type)0x1000
types是void (*)()
– 一个函数的指针(星号),不带任何参数(右括号中的圆括号)(oops,请参阅pmg的注释 )并返回没有值(左边的void
)。 星号上的附加元素可以防止将其关联到void
,这会在这里错误地创build一个void *
types。
所以在强制转换之后,在地址0x1000处有一个指向无参数参数的void函数:
(void (*)())0x1000
那function…
((void (*)())0x1000)
通过添加一个空的参数列表来调用:
((void (*)())0x1000)();
编写该代码的人应该以可读的方式重写它,如下所示:
#define ADDRESS_OF_FUNCTION_X 0x1000 typedef void (*func_ptr_t)(void); ... func_ptr_t function_x = (func_ptr_t)ADDRESS_OF_FUNCTION_X; function_x();
代码做的事情现在非常自我logging。