규칙이 정확합니다. 그러나, 그것을 적용하는 것은 아주 조심해야한다.
C99 + 선언에보다 공식적인 방식으로 적용하는 것이 좋습니다.
여기서 가장 중요한 것은 모든 선언 (const
는, volatile
는, static
는, extern
는, inline
는, struct
이 union
, typedef
단순의 사진에서 제거되지만 다시 쉽게 추가 할 수 있습니다) 다음과 같은 순환 구조를 인식하는 것입니다 :
base-type [derived-part1: *'s] [object] [derived-part2: []'s or()]
네 부분입니다.
[object
]
은 모든 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
, [derived-part2
(포함/반환)] [derived-part2
(포인터)] base-type
1.
재귀가있는 경우 재귀 스택 맨 아래에 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 : 01 234,841,
(void)
*
[3][5]
foo
- 레벨 1 : 마지막으로
*
[7][9]
**
(void)
*
[3][5]
foo
- ,
[3][5]
foo
char
*
[7][9]
**
(void)
*
지금, 오른쪽에서 왼쪽으로 읽는 :
foo
은 char에 대한 9 개의 포인터로 이루어진 7 개의 배열로 된 포인터에 대한 포인터에 대한 포인터를 반환하는 함수에 대한 5 개의 포인터로 이루어진 3 개의 배열로 구성된 배열입니다 (매개 변수 없음).
공정에서 각 derived-part2
의 배열 크기를 역으로 사용할 수 있습니다.
그건 나선형 규칙입니다.
그리고 나선형을 쉽게 볼 수 있습니다. 왼쪽에서부터 더 깊게 중첩 된 [object]
을 다이빙하고 오른편에 서페이스의 위쪽에는 왼쪽과 오른쪽의 다른 한 쌍이 있다는 점에 유의하십시오.
내가 갈 때'Vorac'에게 물어볼 것을 제안한다. 잘못된; 나는 그것이 잘못되는 상황을 알지 못한다. –
@Jonathan Leffler, 알려진 문제가 없으므로 나선 규칙이 결코 잘못되지 않습니까? – Vorac
OK - [의견]이 (가)있는 [James Kanze] (http://stackoverflow.com/users/649665/james-kanze)입니다. (http://stackoverflow.com/questions/7526152/easy-rule-to -read-complicated-const-declarations/7526298 # comment23257858_7526298) 1994 년에 게시 된 기사 (당신이 아닌, 귀인 읽기 오해에 사과드립니다.) 나는 야고보가 반대 한 것이 무엇인지 모른다. 나는 그것이 실패한 상황을 알지 못한다. (그러나 나는 열심히 공부하지 않았다.) 그러한 상황이 없다는 것과 같은 것은 아니지만, 나는 설명 할 수없는, 명백하지 않은 주석을 많은 연기로 간주합니다. –