在语法上,不知道f/g是函数调用还是类型转换,而不知道它们是如何声明的.编译器是否知道解析步骤中的差异,或者他们通常在第二次传递中解决这个问题?
void f(int x){};
typedef short g;
int main(void){
((f)(1));
((g)(1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
非常早期的C版本(在K&R的第一版于1978年出版之前)没有这个typedef特征.在该版本的C中,始终可以在语法上识别类型名称.int,float,char,struct,等是关键词; 类型名称的其他元素是标点符号,例如*和[].(解析器可以区分不是关键字的关键字和标识符,因为它们只有很小且固定的数量.)
当typedef加入,它必须被硬塞进现有的语言.A typedef为现有类型创建新名称.该名称是单个标识符 - 在语法上与任何其他普通标识符不同.
AC编译器在解析其输入时必须维护一个符号表.当遇到标识符时,需要查询符号表以确定它是否是类型名称.没有这些信息,语法就不明确了.
从某种意义上说,typedef声明可以被认为是创建一个新的临时关键字.但它们是可以被内部范围中的新声明隐藏的关键字.
例如:
{
typedef short g;
/* g is now a type name, and the parser has
* to treat it almost like a keyword
*/
{
int g;
/* now g is an ordinary identifier as far as the parser is concerned */
}
/* And now g is a type name again */
}
Run Code Online (Sandbox Code Playgroud)
解析C很难.