一个有趣的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
是一个函数,它没有参数,返回值是一个数组指针,所指向数组的元素为函数指针,该函数指针指向没有参数、返回值为整形的函数。