解析C声明

时间:2018-08-13 10:39:21

标签: c parsing declaration

有人可以帮我弄清楚这个声明吗?

int *x()(int)
void (*signal(int, void (*fp)(int)))(int)

我似乎无法使用给定here的方法来解析它们。我知道什么意味着使用cdecl.org,并且第一个是非法的,但是我想弄清楚如何解析这些内容?

2 个答案:

答案 0 :(得分:3)

首先,一些基本规则:

T   *a[N];   // a is an array of pointer to T
T (*a)[N];   // a is a pointer to an array of T
T    *f();   // f is a function returning a pointer to T
T  (*f)();   // f is a pointer to a function returning T
const T *p;  // p is a non-const pointer to const T
T const *p;  // same as above
T * const p; // p is a const pointer to non-const T

在声明符和表达式中,[]()运算符的优先级都高于*运算符,因此在使用指向数组的指针时,需要使用标识符将其显式分组((*a)[N])和函数指针((*f)())。

当发现一个多毛的声明时,找到最左边的标识符并解决问题,记住上面的规则,并将其递归地应用于任何函数参数:

       signal                               -- signal
       signal(                    )         -- is a function taking
       signal(                    )         --   parameter unnamed
       signal(int,                )         --     of type int
       signal(int,        fp      )         --   parameter fp
       signal(int,      (*fp)     )         --     is a pointer
       signal(int,      (*fp)(   ))         --     to a function taking
       signal(int,      (*fp)(   ))         --       parameter unnamed
       signal(int,      (*fp)(int))         --       of type int 
       signal(int, void (*fp)(int))         --     returning void
     (*signal(int, void (*fp)(int)))        -- returning a pointer
     (*signal(int, void (*fp)(int)))(   )   --   to a function taking
     (*signal(int, void (*fp)(int)))(   )   --     parameter unnamed
     (*signal(int, void (*fp)(int)))(int)   --     of type int
void (*signal(int, void (*fp)(int)))(int);  --   returning void

在英语中,signal是一个函数,该函数将整数和指向信号函数的指针作为参数,然后返回指向处理函数的指针。

有时您没有标识符(例如在仅指定类型的函数原型中),因此您必须在头脑中放置一个占位符(称为λ)并将规则应用于该占位符:

void (*signal(int λ, void (*fp)(int λ)))(int λ);

答案 1 :(得分:2)

当函数返回函数指针时,返回值将包围函数名称及其参数。因此,它有助于从中心开始。

但是解析函数指针语法的最佳方法是根本不必解析它。

第二个示例可以使用typedef编写为:

typedef void funType(int);             // Our function type
funType * signal(int i, funType * fp); // Sane version of the function declaration

当您需要使用函数指针时,请始终首先使用typedef定义函数类型。