我正在维护一大块C代码并尝试改进它,我遇到了一个使用我不熟悉的语法的函数:
char (*(lgLinkStrs)())[CONFIG_MAX_STRING] {
...
}
我知道它返回一个2-dim的字符数组(基本上是一个字符串数组),它被定义为其他地方的全局变量,这不是最佳实践。我熟悉传入和返回数组作为指针的常用方法。
我不明白这种语法,我甚至无法弄清楚谷歌的内容。在我理解之前,我无法改进代码。
有人可以向我解释这种语法意味着什么,或者至少我可以查找它的位置?
从最左边的标识符开始并逐步解决,记住后缀[]
和()
的优先级高于一元*
,所以
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
的额外括号是多余的。
编辑
一些评论者提到了“螺旋规则”,这本身并不是规则,但不符合我上面提到的优先规则:
+---------------+
| +--------+ |
| | +----+ | |
| | | | | |
char ( * f () )[N];
| | | | | |
| | +--+ | |
| +------+ |
+-----------+
lgLinkStrs
是一个返回指向CONFIG_MAX_STRING
char
数组的指针的函数,你在这里定义函数。花括号表示函数的主体。
同样遵循这里的螺旋规则 - 您将轻松获得声明。