不懂奇C函数定义

问题描述 投票:1回答:2

我正在维护一大块C代码并尝试改进它,我遇到了一个使用我不熟悉的语法的函数:

char (*(lgLinkStrs)())[CONFIG_MAX_STRING] {
...
}

我知道它返回一个2-dim的字符数组(基本上是一个字符串数组),它被定义为其他地方的全局变量,这不是最佳实践。我熟悉传入和返回数组作为指针的常用方法。

我不明白这种语法,我甚至无法弄清楚谷歌的内容。在我理解之前,我无法改进代码。

有人可以向我解释这种语法意味着什么,或者至少我可以查找它的位置?

c arrays
2个回答
4
投票

从最左边的标识符开始并逐步解决,记住后缀[]()的优先级高于一元*,所以

T *a[N];    // a is an array of pointers to T
T (*a)[N];  // a is a pointer to an array of T
T *f();     // f is a function returning pointer to T
T (*f)();   // f is a pointer to a function returning T

从而:

        lgLinkStrs                          -- lgLinkStrs
       (lgLinkStrs)                         -- surrounded by superfluous parentheses
       (lgLinkStrs)()                       -- is a function taking no arguments
      *(lgLinkStrs)()                       -- returning a pointer to
     (*(lgLinkStrs)())[CONFIG_MAX_STRING]   -- an array of
char (*(lgLinkStrs)())[CONFIG_MAX_STRING]   -- char

另一种方法是从外部工作 - 你了解char,你了解[CONFIG_MAX_STRING],将其他所有内容简化为简单:

char x[CONFIG_MAX_STRING];

因此,xCONFIG_MAX_STRING大小的char阵列。现在扩展x一步:

char   x [CONFIG_MAX_STRING]
     +-++
     |  |
     V  V
char (*u)[CONFIG_MAX_STRING]

因此,u是指向char数组的指针。我们使用*u而不是u(),因为()具有更高的优先级,因此比*更紧密地绑定表达式。现在扩展u

char (*     u      )[CONFIG_MAX_STRING]
       +----+-----+
       |          |
       V          V
char (*lgLinkStrs())[CONFIG_MAX_STRING]

因此,lgLinkStrs是一个返回指向char数组的指针的函数。显然,原始声明中围绕lgLinkStrs的额外括号是多余的。

编辑

一些评论者提到了“螺旋规则”,这本身并不是规则,但不符合我上面提到的优先规则:

  +---------------+
  |   +--------+  |
  |   | +----+ |  |
  |   | |    | |  |
char  ( * f () )[N];
      | | |  | |  |
      | | +--+ |  |
      | +------+  |
      +-----------+

2
投票

lgLinkStrs是一个返回指向CONFIG_MAX_STRING char数组的指针的函数,你在这里定义函数。花括号表示函数的主体。

同样遵循这里的螺旋规则 - 您将轻松获得声明。

© www.soinside.com 2019 - 2024. All rights reserved.