我试图弄清楚 C 中的以下代码是做什么的?
((void(*)())buf)();
其中'buf'是一个char
数组。
让我们一步一步来。
void(*)()
这是一个指向函数的指针,该函数接受未指定的参数并且没有返回值。
(void(*)())buf
简单地将 buf 转换为这个函数指针类型。最后,
((void(*)())buf)();
调用这个函数。
所以整个语句是“解释buf
为指向void
不带参数的函数的指针,并调用该函数。”
它转换buf
为类型的函数指针void(*)()
(一个函数不返回任何内容/void 并采用未指定的参数)并调用它。
ANSI 标准实际上不允许将普通数据指针转换为函数指针,但您的平台可能允许。
当我遇到令人难以置信的声明时,我倾向于使用“cdecl”命令。例子:
[me@machine]$ cdecl
Type `help' or `?' for help
cdecl> explain (void(*)())buf
cast buf into pointer to function returning void
尽管在某些情况下我确实希望有一个工具可以解释“cdecl”的输出:/
这将转换buf
为 type void (*)()
,一个指向函数的指针,该函数接受未指定的参数并且不返回任何内容。然后它调用该地址处的函数(最右边的两个括号)。
它转换buf
成一个函数指针,它接受未指定的参数,并调用它。
((void(*)())buf)(); \------------/ 将 `buf` 转换为 \---------/ type: 指向函数的指针,接受一个固定但 未指定数量的参数和 返回无效 \----------------/ 并称其为“函数”
我猜想在许多情况下,它会使机器崩溃。否则,它将数组视为指向返回 void 并调用它的函数的指针。
您可能会发现“专家 c 编程”是一本不错的读物——如果我没记错的话,可以在其中一章中解开此类内容。我已经很久没有读过了,但我记得当时我认为这是值得的。 http://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298
有一个在线版本的“cdecl”工具,lsc 提到你可能会发现它很有用:http ://www.cdecl.org/
调用函数指针。该函数没有参数。