o11*_*11c 4 c grammar atomic language-lawyer c11
这里有一个相关的“什么”问题:_Atomic类型说明符和限定符之间的C11语法歧义
我感兴趣的是为什么,因为C11的基本原理尚未发布,而且这似乎不必要地复杂。
语法包括这两种语法(并且解决了歧义,赞成shift使用(而不是reduce(如果后面跟有a declarator或,则将处于超前状态abstract-declarator)),可以从declaration-specifiers或到达specifier-qualifier-list:
atomic-type-specifier: _Atomic ( type-name )
type-qualifier: _Atomic
Run Code Online (Sandbox Code Playgroud)
这将导致以下代码:
int i1;
int (i2); // valid, same as i1 - usually seen in the context of pointer-to-function or pointer-to-array
int _Atomic a1;
int _Atomic (a2); // invalid
_Atomic (int) a3; // valid, same as a1
Run Code Online (Sandbox Code Playgroud)
想法:
_Atomic不得修改数组或函数。除非在声明符周围加上多余的括号,否则这将是有效的#define _Atomic(x) x _Atomic(如果对#define关键字当然是合法的)。
当它发生的qualifier,_Atomic是一样的语法一部分const,和C程序员已经习惯于将const放在正确的一边,所以它不能成为“易用性”。