C - 这条线是什么意思?

时间:2010-01-13 15:57:46

标签: c coding-style embedded

我试图理解有史以来最糟糕的C代码(来自uboot项目)的以下行是什么意思:

rc = ((ulong (*)(bd_t *, int, char *[]))addr) (bd, --argc, &argv[1]);

这是什么?一个函数调用? 它可以更具可读性吗?

提前感谢您的帮助!

6 个答案:

答案 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_tint和指向char数组的指针,并返回{{ 1}}。

代码将ulong转换为此类函数,然后使用addrbd--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]。