- C语言中的`auto`关键字既可以是存储类说明符,也可以是类型推断占位符,当与typedef名称`x`结合时会产生解析歧义。
- GCC将`x`视为typedef,导致`auto x = 67;`报错,而Clang通过前瞻解析能够正确处理。
- C23明确消除了歧义:如果typedef标识符在内层作用域中重新声明,其类型不得被推断。尽管如此,GCC和Clang在实践中仍存在分歧。
- 添加属性(例如`auto x [[attr]] y = 67;`)进一步复杂化了解析:只有GCC能成功处理,而Clang错误地将属性应用于变量`x`。
- Clang支持数组、函数和指针声明符的类型推断(由实现定义),导致像`auto x (y) = 67;`这样的歧义情况。
- GCC和Clang中的`__auto_type`扩展具有不同的作用域语义:GCC在初始化器之后才插入新声明,而Clang采用C23中未指定的声明规则。