复杂的C演员解释

时间:2009-11-11 14:33:50

标签: c casting void

我正在试图找出C中的以下代码是什么?

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

其中'buf'是char数组。

10 个答案:

答案 0 :(得分:21)

让我们一步一步。

void(*)()

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

(void(*)())buf

简单地将buf强制转换为此函数指针类型。最后,

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

调用此函数。

因此整个语句是“将buf解释为指向没有参数的void函数的指针,并调用该函数。”

答案 1 :(得分:9)

它将buf强制转换为类型void(*)()的函数指针(一个函数返回任何/ void并使用未指定的参数)并调用它。

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

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

((void(*)())buf)();
 \------------/         cast `buf` to
 \---------/            type: pointer to function accepting a fixed but
                              unspecified number of arguments and
                              returning void
\----------------/      and call that "function"

答案 6 :(得分:1)

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

答案 7 :(得分:1)

你可能会发现“专家c编程”是一个很好的阅读 - 如果我没记错的话,解压这类东西就在其中一章中。我读了很长时间,但我记得当时认为这是值得的。 http://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298

答案 8 :(得分:1)

有一个'cdecl'工具的在线版本,lsc提到你可能觉得有用:http://www.cdecl.org/

答案 9 :(得分:0)

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

Function Pointer - Wikipedia