Обоснование нерегулярности синтаксиса атомарного спецификатора-vs-квалификатора C11?
Здесь есть связанный вопрос "что": грамматическая неоднозначность C11 между спецификатором _Atomic type и квалификатором
Что меня интересует, так это Почему, поскольку обоснование C11 еще не опубликовано, и это кажется излишне сложным.
Грамматика включает в себя оба из них (и разрешает неоднозначность в пользу shifting (, а не reduce (который в противном случае был бы в lookahead, если бы за ним следовал declarator или abstract-declarator), достижимый из declaration-specifiers или specifier-qualifier-list:
atomic-type-specifier: _Atomic ( type-name )
type-qualifier: _Atomic
Это приводит к следующему коду:
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
Мысли:
-
_Atomicне следует изменять массив или функцию. За исключением избыточных скобок вокруг Декларатора, это означает, что он будет действителен для#define _Atomic(x) x _Atomic(если бы это было законно для ключевых слов#define, конечно). -
Когда это происходит как
qualifier,_Atomicэто та же синтаксическая часть, что иconst, А C-программисты уже привыкли ставитьconstна правильную сторону, так что это не может быть для "удобства использования".
1 ответ:
Обоснование находится в N1485 :
Ключевое слово
_Atomicтакже может быть использовано в виде_Atomic(T), гдеT- тип, в качестве спецификатора типа эквивалентный_Atomic T. Таким образом,_Atomic(T) x, y;объявляетxиyс одинаковым типом, даже еслиT- тип указателя. Это позволяет банальной совместимости с++0х только с определением макроса_Atomic(T)на языке C++ какatomic<T>.