我正在试图找出C中的以下代码是什么?
((void(*)())buf)();
其中'buf'是char
数组。
答案 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)
调用函数指针。该函数没有参数。