8

我试图弄清楚 C 中的以下代码是做什么的?

((void(*)())buf)();

其中'buf'是一个char数组。

4

10 回答 10

21

让我们一步一步来。

void(*)()

这是一个指向函数的指针,该函数接受未指定的参数并且没有返回值。

(void(*)())buf

简单地将 buf 转换为这个函数指针类型。最后,

((void(*)())buf)();

调用这个函数。

所以整个语句是“解释buf为指向void不带参数的函数的指针,并调用该函数。”

于 2009-11-11T14:37:33.570 回答
9

它转换buf为类型的函数指针void(*)()(一个函数不返回任何内容/void 并采用未指定的参数)并调用它。

ANSI 标准实际上不允许将普通数据指针转换为函数指针,但您的平台可能允许。

于 2009-11-11T14:36:26.163 回答
5

当我遇到令人难以置信的声明时,我倾向于使用“cdecl”命令。例子:

[me@machine]$ cdecl
Type `help' or `?' for help
cdecl> explain (void(*)())buf
cast buf into pointer to function returning void

尽管在某些情况下我确实希望有一个工具可以解释“cdecl”的输出:/

于 2009-11-11T14:57:34.810 回答
4

这将转换buf为 type void (*)(),一个指向函数的指针,该函数接受未指定的参数并且不返回任何内容。然后它调用该地址处的函数(最右边的两个括号)。

于 2009-11-11T14:37:02.200 回答
2

它转换buf成一个函数指针,它接受未指定的参数,并调用它。

于 2009-11-11T14:36:39.237 回答
2
((void(*)())buf)();
 \------------/ 将 `buf` 转换为
 \---------/ type: 指向函数的指针,接受一个固定但
                              未指定数量的参数和
                              返回无效
\----------------/ 并称其为“函数”
于 2009-11-11T14:41:14.967 回答
1

我猜想在许多情况下,它会使机器崩溃。否则,它将数组视为指向返回 void 并调用它的函数的指针。

于 2009-11-11T14:36:38.300 回答
1

您可能会发现“专家 c 编程”是一本不错的读物——如果我没记错的话,可以在其中一章中解开此类内容。我已经很久没有读过了,但我记得当时我认为这是值得的。 http://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298

于 2009-11-11T14:53:12.853 回答
1

有一个在线版本的“cdecl”工具,lsc 提到你可能会发现它很有用:http ://www.cdecl.org/

于 2009-11-13T10:45:21.920 回答
0

调用函数指针。该函数没有参数。

函数指针 - 维基百科

于 2009-11-11T14:37:07.997 回答