不要理解奇怪的C函数定义

时间:2018-01-22 17:54:17

标签: c arrays

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

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

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

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

有人可以向我解释一下这种语法的含义,或者至少我可以在哪里查找它?

2 个答案:

答案 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数组的指针的函数,你在这里定义函数。花括号表示函数的主体。

此外,请遵循螺旋规则 - 您将轻松获得声明。