Hasty Briefsbeta

双语

The perils of parsing type inference declarations in C

6 hours ago
  • 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中未指定的声明规则。