我不明白下面的声明,有人能帮我一下吗。这有点混乱,我找不到任何适当的解释这个表达式加上我从未见过这种类型的声明在我的实践。

char(*(*x())[])();
char(*(*x[3])())[5];
void (*b(int, void (*f)(int)))(int);
void (*ptr)(int(*)[2], int(*)(void));

最佳答案

你需要分解它们,最后两个更容易:

char (*(*x())[])();
char (*x)();        // A pointer to a function returning char with any args.
char (*x[])();      // An array of such pointers.
char (*(*x)[])();   // A pointer to such array.
char (*(*x())[])(); // A function returning such pointer: A function returning a pointer to
                    // an array of pointer to function returning char with any args.

char(*(*x[3])())[5];
char(*x)();          // A pointer to a function returning char with any args.
char(*x)()[5];       // A pointer to a function returning an array of 5 chars (any args).
char((*x)())[5];     // Same as above.
char(*(*x)())[5];    // A pointer to a function returning a pointer to an array of 5 chars.
char(*(*x[3])())[5]; // An array of 3 of these pointers.

void (*b(int, void (*f)(int)))(int);
X b(int, void(*f)(int)); // A function returning X and taking an int and a pointer to
                         // a function f taking an int and returning nothing.
void (*b())(int); // A function taking nothing and returning a pointer to a function
                  // taking and int and returning nothing.
void (*b(int, void (*f)(int)))(int); // Combination of the two above, a function taking and
                                     // an int and a pointer to a function f and returning
                                     // a pointer to a function.

void(*ptr)(int(*)[2], int(*)(void)); // This one is easier:
void(*ptr)(); // A  pointer to a function with no args and returning nothing.
void(*ptr)(int(*)[2], int(*)(void)); // A pointer to a function returning nothing and taking:
                                     // - A pointer to an array of 2 int
                                     // - A pointer to a function returning int with no args.

您可以使用cdecl.org检查所有这些。
需要分解此类声明时的一些提示:
返回指向数组或函数的指针的函数并不常见,但您必须知道如何声明它们:
int (*f())[5];   // A function returning a pointer to an array of 5 int.
int (*f())(int); // A function returning a pointer to a function int (*)(int).

注意,在这两个声明中,返回类型的一部分出现在函数的参数列表之后,这就是为什么当您第一次遇到它们时,它们常常会变得混乱。
您始终可以删除函数中参数的名称:
int b(void(*f)(int), int(*p)[2]);
int b(void(*)(int), int(*)[2]); // Same as above

如果名称直接挨着方括号,例如x[N],则它是一个“数组N of something”:
int (*x[3])();  // x is an array of 3 pointers to functions int(*)().
int (*x[4])[5]; // x is an array of 4 pointers to array of 5 int.
int (*x)[4];    // x is not an array.

关于c - 以下C声明的含义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39954412/

10-12 07:35
查看更多