如何通过C编译器解析类型转换?

And*_*son 8 c parsing

在语法上,不知道f/g是函数调用还是类型转换,而不知道它们是如何声明的.编译器是否知道解析步骤中的差异,或者他们通常在第二次传递中解决这个问题?

void f(int x){};
typedef short g;

int main(void){
   ((f)(1));
   ((g)(1));
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 6

非常早期的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很难.