gpt4 book ai didi

c - C 编译器如何解析类型转换?

转载 作者:太空狗 更新时间:2023-10-29 17:01:45 24 4
gpt4 key购买 nike

这里在不知道 f/g 是如何声明的情况下,在语法上不可能判断 f/g 是函数调用还是类型转换。编译器是否知道解析步骤的区别,或者他们通常会在第二遍中解决这个问题?

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

int main(void){
((f)(1));
((g)(1));
return 0;
}

最佳答案

C 的早期版本(在 1978 年第一版 K&R 发布之前)没有 typedef 功能。在那个版本的 C 中,类型名称总是可以在句法上被识别。 intfloatcharstruct等都是关键字;类型名称的其他元素是标点符号,例如 *[]。 (解析器可以区分关键字和不是关键字的标识符,因为它们的数量很少且固定。)

添加 typedef 时,必须将其硬塞到现有语言中。 typedef 为现有类型创建新名称。该名称是一个单一的标识符 -- 在语法上与任何其他普通标识符没有区别。

C 编译器在解析其输入时必须维护一个符号表。当它遇到一个标识符时,它需要查阅符号表来确定它是否是一个类型名称。没有这些信息,语法就会有歧义。

在某种意义上,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 */
}

解析 C 很难。

关于c - C 编译器如何解析类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24876405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com