【问题标题】:C - What does this line mean?C - 这条线是什么意思?
【发布时间】:2010-01-13 15:57:46
【问题描述】:

我试图理解下面这行最糟糕的 C 代码(来自 uboot 项目)的含义:

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

这是什么?函数调用? 可读性更高吗?

提前感谢您的帮助!

【问题讨论】:

  • 你能告诉我们这一行中不同变量的声明类型吗?
  • 可读性更好吗?一定不行!混淆它!
  • @David:很抱歉,但我不知道。我刚刚打开了这个项目,并试图了解什么是什么。
  • Stefano,我承认它具有某种洛夫克拉夫特式的品质。
  • Mmmm 转换为函数指针甜点,顶部带有 --argc cherry :o) 它实际上是可读的,只是心理解析可能需要一段时间。顺便说一句,正确的项目地址是:denx.de/wiki/U-Boot/WebHome

标签: c coding-style embedded


【解决方案1】:

是的,这是一个函数调用。

它将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 可能有点过头了,但我觉得能够单独查看函数指针的类型很有帮助。

【讨论】:

  • 由于 typedef 使事物可读,它并不过分。
  • 这不是过度杀伤,就像抗生素不是对感染的过度反应一样。
【解决方案2】:

它将addr 转换为接受(bd_t *, int, char *[]) 作为参数并返回long 的函数指针,然后使用参数(bd, --argc, &argv[1]) 调用它。

【讨论】:

  • 对。而要回答第二个问题,不,它不能变得更具可读性。
  • @Jason:当然可以(并且应该),请参阅 unwind 的答案。
  • Finnegan's Wake 的可读性也很好,但从中提取意义非常困难。
  • @T.J.克劳德:这只是将感知到的不可读性转移到其他地方。 (需要说明的是,我不同意任何一个版本都不可读。只是如果有人要找到原始的不可读性,将部分不可读性卸载到其他地方并不会降低不可读性。)
  • @Stephen:很多 C 程序员,尤其是新人,根本不需要经常处理函数指针。此外,在声明函数的同一个头文件中声明指针类型(如果你必须使用一个)是更好的编程实践,这样如果你需要更改函数,你就不会破坏每个单独的手工编码演员。在我看来,维护 101。
【解决方案3】:

不是对您问题的直接回答,但可能会引起您的兴趣:

从变量名开始(或 如果没有标识符,则最里面的构造 存在。不跳就看右 在右括号上;说你 看。再向左看而不跳 在括号内;说出你所看到的。 跳出一级括号 if 任何。向右看;说出你所看到的。 看左边;说出你所看到的。继续 以这种方式,直到你说 变量类型或返回类型。

【讨论】:

    【解决方案4】:

    ulong (*)(bd_t *, int, char *[]) 是一个函数类型,它接受指向 bd_tint 和指向 char 数组的指针,并返回 ulong

    代码将addr转换为这样的函数,然后以bd--argc&argv[1]为参数调用它,并将结果分配给rc

    【讨论】:

      【解决方案5】:

      addr 必须是函数在内存中的位置,看起来像

      ulong *funcname(bd_t*, int, char*[])
      

      它被像这样的参数调用

      rc = funcname(bd, --argc, &argv[1]);
      

      【讨论】:

        【解决方案6】:

        您将“addr”类型转换为一个指向函数的指针,该函数返回一个以 bd_t *、一个 int 和一个 char *[] 作为参数的 ulong,然后使用参数 bd、--argc、 &argv [1]。

        【讨论】:

          猜你喜欢
          • 2012-05-04
          • 2015-01-27
          • 1970-01-01
          • 1970-01-01
          • 2014-03-19
          • 2020-01-22
          • 1970-01-01
          • 2012-03-23
          • 2010-11-02
          相关资源
          最近更新 更多