我试图理解有史以来最糟糕的C代码(来自uboot项目)的以下行是什么意思:
rc = ((ulong (*)(bd_t *, int, char *[]))addr) (bd, --argc, &argv[1]);
这是什么?一个函数调用? 它可以更具可读性吗?
提前感谢您的帮助!
答案 0 :(得分:34)
是的,这是一个函数调用。
它将addr
中的值转换为函数指针,该函数指针接受(bd_t *, int, char *[])
作为参数并返回ulong
,并调用该函数。可以加入:
typedef ulong (*bd_function)(bd_t *bd, int argc, char *argv[]);
bd_function bdfunc = (bd_function) addr;
rc = bdfunc(bd, --argc, &argv[1]);
如果只发生一次typedef
,这可能有点过分,但我觉得能够分别查看函数指针的类型会有很大帮助。
答案 1 :(得分:12)
它将addr
强制转换为函数指针,该指针接受(bd_t *, int, char *[])
作为参数并返回long
,然后使用参数(bd, --argc, &argv[1])
调用它。
答案 2 :(得分:4)
不能直接回答您的问题,但可能会感兴趣:
从变量名称开始(或 最内层构造,如果没有标识符 存在。看起来没有跳跃 右括号;说什么你 看到。再看左边没有跳跃 在括号上;说出你所看到的。 如果是,请跳出括号的级别 任何。向右看;说出你所看到的。 看左边;说出你所看到的。继续 以这种方式直到你说出来 变量类型或返回类型。
答案 3 :(得分:2)
ulong (*)(bd_t *, int, char *[])
是一个函数的类型,它接收指向bd_t
,int
和指向char
数组的指针,并返回{{ 1}}。
代码将ulong
转换为此类函数,然后使用addr
,bd
和--argc
作为参数调用它,并将结果分配给{{ 1}}。
答案 4 :(得分:2)
ulong *funcname(bd_t*, int, char*[])
并使用
等参数调用它rc = funcname(bd, --argc, &argv[1]);
答案 5 :(得分:1)
你是指向一个指向函数的指针的“addr”,该函数返回一个以bd_t *,一个int和一个char * []作为参数的ulong函数,然后使用参数bd, - argc调用该函数, & argv [1]。