I was just going through some code on the Internet and found this:
float * (*(*foo())[SIZE][SIZE])()
How do I read this declaration? Is the
Generally, you could try cdecl.org but you'd need to substitute for SIZE
Say you swap SIZE
for 12, you'd get:
declare foo as function returning pointer to array 12 of array 12 of pointer to function returning pointer to float
I'm not sure that really helps you!
Two observations here:
Although most of the answers above are good enough, there is a lack of complete set of rules for decoding complex C declarations. I have provided a complete set below to decode any complex C declaration. This set of rules is actually based on the precedence of operators. Rules such as right hand spiral rules can be thought of as a shortcut for these set of rules.
Before anything else we need to know a few things to decode the declaration.
'Basic Type' of a declaration
A C declaration always has only one basic declaration type. This is at the left most position of a declaration. For example -
int a
- basic type is 'int'float *p
- basic type is 'float'char (*p)[3]
- basic type is 'char'Precedence and associativity
Next we need to know the precedence order of ()
, []
, and *
- dereference operator
()
, []
- Associativity is left to right*
- Associativity is right to leftPhrase corresponding to each of the operator above
Next we need to know the decoded phrase corresponding to each operator. Examples ahead will make this point clear.
()
- function returning[SIZE]
- array of SIZE*
- pointer toNow follow the rules below to decode the declaration
Always write the variable name first followed by an 'is'.
For example -
int a
- a is ...float *p
- p is ...char (*p)[3]
- p is ...Always end with basic type
For example -
int a
- a is ... intfloat *p
- p is ... floatchar (*p)[3]
- p is ... charNow fill the part in between using the following sub-steps
Starting from the name, follow the operator precedence and associativity to choose next highest priority operator and append the phrase corresponding to it to the middle part of the decoded string.
Repeat the sub step above for the remaining declaration until the decoding process is complete
NOTE 1: For simplicity, I have ignored the arguments of the function however it can be included just after the phrase corresponding to ()
.
NOTE 2: Parenthesis(()
) change the priority order of operators, just like in any arithmetic expression.
NOTE 3: You can use parenthesis in the decoded declaration to increase readability( I have done it in some examples below). Think of each set of () as a single unit.
NOTE 4: A n dimensional array is actually an array of array of ... (n-1 times) array. For ex - int A[2][3] - A is array of 2 (array of 3 int) i.e A is an array of 2 elements in which each element is an array containing 3 integers
Examples
int a
- a is intfloat *p
- p is pointer to floatchar (*p)[3]
- p is pointer to array of 3 charSome complex declaration examples
int **p[10]
- p is array of 10 pointer to pointer to intint (*p)[10]
- p is pointer to array of 10 intint *p(char *a)
- p is function returning pointer to intint (*p(char*a))[10]
- p is function returning (pointer to (array of 10 int))int *(*p)()
- p is pointer to (function returning (pointer to int))int (*p()[20])[10]
- p is function returning (array of 20 (pointer to (array of 10 int)))This set of rules can be used with const
as well - const qualifier modifies the term to the left of it (if present) otherwise it modifies the term to the right of it.
const int *p[10]
- p is array of 10 pointer to int constint const *p[10]
- p is array of 10 pointer to const int (this is same as 7th example)int *const p[10]
- p is array of 10 const pointer to intNow a really complex example which will not find its use anywhere in practice but nevertheless can be used to demonstrate the decoding process
char *(*(**foo[][8])())[]
- foo is array of (array of 8 (pointer to (pointer to (function returning (pointer to (array of (pointer to char)))))))Now at last decoding for the declaration given in the question
float * (*(*foo())[SIZE][SIZE])()
- foo is function returning (pointer to (array of SIZE (array of SIZE (pointer to (function returning pointer to float)))))
The following is the link for the article from which I read this decoding process
Example 10 has been taken from this article
http://www.unixwiz.net/techtips/reading-cdecl.html