一个有趣的C函数定义

在写项目的单元测试时,我需要一些函数定义作为测试用例,于是告诉ChatGPT给我一个稀奇古怪的C函数定义,并获得如下定义:

int (*(*foo())[])() {return 0;}

确实挺复杂的,那么该怎么分析这个函数定义到底是什么意思呢?在《C语言缺陷与陷阱》的“理解函数定义”一章,介绍了一个很好的分析方法,它的关键在于弄清楚声明符(declarator)的含义。比如:

int *a;

包括类型int和声明符*a对声明符的求解结果即为声明类型*a的结果是整形,故a是一个整形指针。类似地,我们可以分析上面复杂的函数定义。(*(*foo())[])()的求解结果为整形,故*(*foo())[]是一个没有参数,返回值为整形的函数。由于[]的运算优先级高于*,故*(*foo())[]等价于*((*foo())[]),所以(*foo())[]是一个函数指针,它指向没有参数、返回值为整形的函数。

让我们继续继续分解,*foo()的求解结果是一个数组,数组元素为函数指针,指向没有参数、返回值为整形的函数。符号()的运算优先级高于**foo()等价于*(foo())。所以,foo()的求解结果是一个数组指针,数组元素为函数指针,指向没有参数、返回值为整形的函数。终于,我们分析完了,foo是一个函数,它没有参数,返回值是一个数组指针,所指向数组的元素为函数指针,该函数指针指向没有参数、返回值为整形的函数。