C和C++声明的解析中使用的螺旋规则和“声明遵循使用”原则

19

这个问题是关于C语言声明的,与另一个问题有关。在阅读这个问题的答案时,我了解了spiral rule,并且也明白了“声明跟随使用”的含义。

到目前为止还好。但是接着我读到了这个声明

char *(*(*a[N])())(); 

我想知道如何使用“声明跟随使用”原则来解析它,特别是数组部分。

我所读到的内容是:

(*(*a[N])()) 

这是一个返回 char * 类型的函数(),然后对其进行解引用。

(*a[N])() // 1
这是一个“返回char指针的函数”,因此1是“返回char指针的函数的指针”,那么我会说,“当调用(*a [N])时,它就是[先前的声明]”。现在我们有(*a [N])是一个返回指向返回char指针的函数的指针的函数。
但是我不知道如何应用此规则来区分“指向数组”的指针和“数组”的指针。
还有一个问题:在这样的声明中,“&”(在C ++中)、“*”和“[]”之间的“优先级”规则是什么?[也许“优先级”不是正确的术语]
为了检查我是否正确理解了“螺旋规则”,我也解析了下面的表达式,请告诉我如果我错了。
       +-----------+
       | +------+  |
       | | +-+  |  |
       | | ^ |  |  |
char* (*(* a[N])())(); 
    ^  ^ ^   ^  ^  ^
    |  | |   |  |  |
    |  | +---+  |  |
    |  +--------+  |
    +--------------+

对我而言,(逐个循环)更容易:

  • a 是一个长度为N的数组...
  • 指向返回...的函数指针
  • 指向返回...的函数指针
  • char *

但我可能会忽略某些情况,在这种情况下,让我得到正确答案,但在另一种更复杂的情况下也可能是错误的。


@Vality:如果你要删除C++标签,那么你也需要在C++中删除对&的提及。 - Jonathan Leffler
@JonathanLeffler 说得好。通常我会说这需要分成两个问题,但这是一个如此古老的问题,我不太愿意这样做。 - Vality
@Vality 怎么突然有这么多人关注这个问题了?(我因为“好问题”徽章得到了通知)。 - Cedric H.
@CedricH。我怀疑这是因为正在进行的投票将https://dev59.com/D1sW5IYBdhLWcg3w0aDL标记为此问题的重复。 - Vality
1个回答

16

您只需要逐步构建它。

char *X();  // X =~ (*(*a[N])())

返回 char* 的函数

char *(*Y())();  // Y =~ (*a[N])

返回指向返回char*的函数指针的函数。

在声明中,就像在表达式中一样(声明遵循使用),后缀的[]的优先级高于一元运算符*,因此*a[N]等同于*(a[N]),而不是(*a)[N]

char *(*(*Z)())();  // Z =~ a[N]

指向返回指向返回char*的函数指针。

char *(*(*a[N])())();

一个包含N个指向返回 char* 的函数指针的指针数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接