将地址强制转换为函数:使用 "void * void "

Casting an address to a function: using "void * void "

本文关键字:void 使用 函数 地址 转换      更新时间:2023-10-16

我遇到了一个函数调用

    // call the entry point from the ELF header
    // note: does not return!
    ((void (*)(void)) (ELFHDR->e_entry & 0xFFFFFF))();

ELFHDR->e_entry 是一个函数指针。我认为((void (*)(void))是返回类型。但我不确定void * void是什么类型。

有没有规则来分辨这种类型?

谢谢!

void (*)(void)

是指向不带参数且不返回任何值的函数的类型指针。

例如:

void foo(void)
{
}
void (*p)(void) = foo;  // p is of type void (*)(void)

你说"我认为((void (*)(void))是返回类型" - 不是。 它正在投射表达式

(ELFHDR->e_entry & 0xFFFFFF)

成为指向不带参数且不返回任何内容的函数的指针。

语句的最后一个()通过该指针调用函数。

你想要的工具是cdecl,它将C类型翻译成英语。在这种情况下,它翻译为:

(void (*)(void))

到:

cast unknown_name into pointer to function (void) returning void