Spiral rule and 'declaration follows usage' for parsing C and C++ declarations

烂漫一生 提交于 2019-11-26 06:38:18

问题


This question follows this other question about C declarations. Reading the answer to this question, I read about the spiral rule and I also understood what \"declaration follows usage\" means.

Ok so far. But then I read this declaration:

char *(*(*a[N])())(); 

and I was wondering how to parse it with the \"declaration follows usage\" \'rule\'. Especially for the array part.

What I read is:

(*(*a[N])()) 

is a function () returning a char *, then, dereferencing the following

(*a[N])() // 1

is this \'function returning a char*\', and so 1 is a \'pointer to a function returning char *\' then I would say \'when (*a[N]) is called, it is [previous declaration]\'. At this point we have (*a[N]) is a function returning a pointer to a function returning char *.

But then I don\'t know how to apply this rule to distinguish between the \'pointer to array\' and \'array of pointer\'.

Can someone clarify this?

Other question: what are the rules of \"precedence\" in such declarations, between & (in C++), *, and []? [maybe \"precedence\" is not the correct term]


To check if I understood the \'spiral rule\' correctly, I also parse this expression below; please tell me if I am wrong.

       +-----------+
       | +------+  |
       | | +-+  |  |
       | | ^ |  |  |
char* (*(* a[N])())(); 
    ^  ^ ^   ^  ^  ^
    |  | |   |  |  |
    |  | +---+  |  |
    |  +--------+  |
    +--------------+

For me it is easier (loop by loop):

  • a is an array of N ...
  • pointer to function returning ...
  • pointer to function returning ...
  • char *

But I am maybe missing something which in that case let me obtain the correct answer but that could be wrong in another more complicated case.


回答1:


You just have to build it up in steps.

char *X();  // X =~ (*(*a[N])())

Function returning char*

char *(*Y())();  // Y =~ (*a[N])

Function returning pointer to function returning char*.

In a declaration, just as in an expression (declaration follow usage), postfix [] has a higher precedence that unary * so *a[N] is equivalent to *(a[N]), not (*a)[N].

char *(*(*Z)())();  // Z =~ a[N]

Pointer to function returning pointer to function returning char*.

char *(*(*a[N])())();

Array of N pointers to functions returning a pointer to function returning char*.



来源:https://stackoverflow.com/questions/3707096/spiral-rule-and-declaration-follows-usage-for-parsing-c-and-c-declarations

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!