ルールは正しいです。しかし、それを適用する際に非常に慎重でなければならない。
私はC99 +宣言のためのより正式な方法でそれを適用することを提案します。
ここで最も重要なことは、すべての宣言(const
、volatile
、static
、extern
、inline
、struct
、union
、typedef
を簡単にするために画像から削除されますが、簡単に戻って追加することができます)の以下の再帰構造を認識することです。
base-type [derived-part1: *'s] [object] [derived-part2: []'s or()]
これは4つの部分です。
where
base-type is one of the following (I'm using a bit compressed notation):
void
[signed/unsigned] char
[signed/unsigned] short [int]
signed/unsigned [int]
[signed/unsigned] long [long] [int]
float
[long] double
etc
object is
an identifier
OR
([derived-part1: *'s] [object] [derived-part2: []'s or()])
* is *, denotes a reference/pointer and can be repeated
[] in derived-part2 denotes bracketed array dimensions and can be repeated
() in derived-part2 denotes parenthesized function parameters delimited with ,'s
[] elsewhere denotes an optional part
() elsewhere denotes parentheses
あなたが解析されたすべての4つの部分を持ってたら、
[object
] [derived-part2
(含む/戻る)] [derived-part2
(ポインタへ)] base-type
です。
再帰がある場合は、再帰スタックの一番下にobject
(ある場合)があります。これは最も内側のものです。バックアップして収集して結合することで完全な宣言を得られます再帰の各レベルで導出された部分。
を解析すると、[derived-part2]
(該当する場合)の後に移動することがあります。これにより、線形でわかりやすい宣言が得られます(を参照)。
したがって、
char* (**(*foo[3][5])(void))[7][9];
にあなたが得る:
base-type
= char
- レベル1:=
*
derived-part1
、= (**(*foo[3][5])(void))
object
、derived-part2
= [7][9]
- レベル2:
derived-part1
= **
、= (*foo[3][5])
object
、derived-part2
= (void)
- レベル3:=
*
derived-part1
、= foo
object
、derived-part2
= [3][5]
そこから:
- レベル3:
*
[3][5]
foo
- レベル2:
**
(void)
*
[3][5]
foo
- レベル1:今すぐ
*
[7][9]
**
(void)
*
[3][5]
foo
- 最後に、
char
*
[7][9]
**
(void)
*
[3][5]
foo
、右から左へ読み:
foo
は、charへの9つのポインタからなる7つの配列の配列へのポインタへのポインタを返す、関数への5つのポインタからなる3つの配列の配列です(パラメータなし)。
また、処理中のderived-part2
に配列のサイズを逆にすることもできます。
これはあなたのスパイラルルールです。
そして、らせんを見るのは簡単です。あなたはより深くネストされた[object]
を左からダイビングしてから、右にリサーフェイスするだけで、上のレベルに左右の別のペアがあることに注意してください。
私はあなたに 'Vorac'違う;私はそれが間違っている状況を認識していません。 –
@Jonathan Leffler、既知の問題はなく、スパイラルルールは決して間違いありませんか? – Vorac
OK - だから[James Kanze](http://stackoverflow.com/users/649665/james-kanze)who [views](http://stackoverflow.com/questions/7526152/easy-rule-to 1994年に投稿された記事(あなたではなく、誤った属性のためにお詫び申し上げます)には、-read-complex-const-declarations/7526298#comment23257858_7526298)私はジェームズの反対が何であるか分かりません。私はそれが失敗する状況を知りません(しかし、私はそれを勉強していません)。そのような状況はないと言っているのと同じではありませんが、私はそのような説明できない、綿密なコメントは非常に煙であると考えています。 –