理解一些复杂的C/C++声明

6

可能是重复问题:
如何理解复杂的函数声明?

考虑以下代码:

char (*(*x())[5])()

我该如何分析这个表达式?

我认为这是一个函数,返回大小为5的数组,其成员是不接受输入且返回字符的函数指针。

我的理解正确吗?


7
请访问http://cdecl.org/查看非平凡声明。 - hmjd
声明x为一个返回指向函数的指针,该函数返回指向字符的指针数组的函数。- http://cdecl.org/ - Artefact2
不,这是一个返回指向包含五个函数指针的数组的指针的函数,这些函数接受(C:未指定参数| C ++:无参数)并返回char。在C或C ++中,不允许函数返回数组。正在搜索重复... - CB Bailey
相似内容:https://dev59.com/HXA65IYBdhLWcg3wqAWt - CB Bailey
@BoPersson: 我看到了这个表达式,所以想知道如何实现,并且也许我将来会编写C或C++编译器,因此很高兴了解这两种语言的每一个细节。 - Jichao
显示剩余2条评论
2个回答

14

搜索“右手法则”。

在您的情况下,应该是:

         x          : x is a
         x()        : function
        *x()        : returning pointer to
       (*x())[5]    : a 5-element array of 
      *(*x())[5]    : pointer to
     (*(*x())[5])() : function
char (*(*x())[5])() : returning char

不是一个包含5个元素的数组,而是一个包含超过5个元素的数组。它至少有6个元素。 - user1717828
@user1717828 我很好奇你的意思是什么。声明是[5],这意味着“有5个元素的数组”。当然,你可以访问第五个元素之外的内容,但这不是声明告诉你的。 - Adrian Shum
好的,现在我只是留下我的原始评论,以便任何其他容易陷入同样陷阱的人不会重复我的错误。我以为它正在访问数组的[5](第六个)成员。#新手错误 - user1717828

12

最近在 Stack Overflow 上,我看到了很多奇怪的声明。

当我懒得思考时,我使用 cdecl.org:

"声明 x 为返回指向函数指针数组的指针,该函数返回字符"

而当我不懒得思考时,我会使用顺时针螺旋规则<-它很哦!


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