2016-04-03 7 views
3

そこここに「何を」に関連する質問です:C11の根拠はまだ公開されていない、これは不必要に複雑と思われるので、C11 grammar ambiguity between _Atomic type specifier and qualifierC11 _Atomic specifier-vs-qualifier構文の不規則性の根拠?

私が興味を持って何が、なぜです。

文法は、これらの両方を含む(およびINGのshiftを支持して曖昧さを解決する(declarator又はabstract-declarator)、続いてそれ以外の場合、ルックアヘッドであろうよりもむしろreduce()declaration-specifiers又はspecifier-qualifier-listから到達可能な、:

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-type-specifier: _Atomic (type-name) 
type-qualifier: _Atomic 

これは、次のコードにつながる

  • _Atomicは、配列や関数を変更しないでください。宣言子の周りに冗長なかっこを付けないと、#define _Atomic(x) x _Atomic(これはもちろん#defineキーワードには合法であった場合)に有効です。それはqualifierとして生じる場合

  • は、_Atomicconstと同じ構文部分であり、Cプログラマは正しい側constを置くために使用既にであるので、「使いやすさ」のことはできません。

答えて

4

根拠はN1485に見出される:

_AtomicキーワードもT_Atomic Tに相当型指定子として、型であるフォーム_Atomic(T)、 においても使用することができます。 したがって、_Atomic(T) x, y;はとyが同じタイプで、 の場合でもTがポインタ型であると宣言します。これにより、C++ 0xとC++のみの_Atomic(T)マクロ定義がatomic<T>のような、些細なC++ 0x互換性が可能になります。

+0

「const int * x、* const y; '==' const int * x; const int * const y; '。アトミックポインタ型を修飾する 'const'型修飾子を使って行える' _Atomic'型修飾子でも同じことができます。これは、私が知っている限り、 '_Atomic'型修飾子が存在する唯一のもっともらしい理由です。そうでなければ、無意味なことです。 –

+0

さて、私たちは、*キャストmalloc *のゴミのいくつかが[** N1485 pp.4 **](http://www.open-std.org/jtc1/sc22/wg14/ www/docs/n1485.pdf) –