5.12 复杂声明
C 语言有时会因为声明的语法而受到谴责,特别是涉及函数指针的声明语法。语法试图使声明和使用一致;在简单的情况下它的效果不错,但在更复杂的情况下会让人困惑,因为声明不能从左往右读,而且括号被过度使用了。如下两个声明
int *f(); /* f:返回int指针的函数 */
和
int (*pf)(); /* pf:指向返回int的函数的指针 */
它们之间的差异就说明了这个问题:* 是前缀操作符且优先级比括号低,为了强制得到正确的关联就需要括号。
尽管真正复杂的声明在实际工作中很少出现,但明白如何理解复杂声明,以及在有需要时知道如何创建复杂声明,都是很重要的。用 typdef 在几个小步骤中合成声明是一种不错的方式,将会在 6.7 节讨论。而本节我们给出的替代方式是一对程序,它们分别把合法的 C 语言转换成文字描述,以及把文字描述反向转换成 C 语言。文字描述是从左往右读的。
第一个程序叫 dcl, 更复杂一些。它将 C 语言声明转换成【英文】文字描述,如下:
char **argv:
argv: pointer to pointer to char (指向char指针的指针)
int (*daytab)[13]
daytab: pointer to array[13] of int (指向有13个元素的整数数组的指针)
int *daytab[13]
daytab: arrar[13] of pointer to int (由13个整数指针组成的数组)
void *comp()
&nb

7418

被折叠的 条评论
为什么被折叠?



