我正在维护一大块C代码并尝试改进它,我遇到了一个使用我不熟悉的语法的函数:
char (*(lgLinkStrs)())[CONFIG_MAX_STRING] {
...
}
我知道它返回一个2-dim的字符数组(基本上是一个字符串数组),在其他地方被定义为一个全局变量,这不是最佳实践。我熟悉传入和返回数组作为指针的常用方法。
我不理解这种语法,我甚至无法弄清楚谷歌的内容。在我理解之前,我无法改进代码。
有人可以向我解释一下这种语法的含义,或者至少我可以在哪里查找它?
答案 0 :(得分:4)
从最左边的标识符开始,然后解决问题,记住postfix MYDEBUG
和[]
的优先级高于一元()
,所以
*
因此:
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];
是一个x
大小的CONFIG_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
答案 1 :(得分:2)
lgLinkStrs
是一个返回指向CONFIG_MAX_STRING
char
数组的指针的函数,你在这里定义函数。花括号表示函数的主体。
此外,请遵循螺旋规则 - 您将轻松获得声明。