小林:用下面这样的代码
extern int func();
int (*fp)() = func;
当一个函数名出现在这样的表达式中时, 它就会 “蜕变” 成一个指针 , 这有点类似数组名的行为。通常函数的显示声明需要事先知道。因为此处并没有隐式的外部函数声明 (初始式中函数名并非一个函数调用的一部分)。
读者:声明 struct x1 { ...}; 和 typedef struct { ...} x2; 有什么不同?
小林:第一种形式声明了一个 “结构标签”; 第二种声明了一个 “类型定义”。主要的区别是在后文中你需要用 “struct x1” 引用第一种, 而用 “x2” 引用第二种。也就是说, 第二种声明更像一种抽象类新 —– 用户不必知道它是一个结构, 而在声明它的实例时也不需要使用 struct 关键字。