代码之家  ›  专栏  ›  技术社区  ›  abjoshi - Reinstate Monica

解析C声明

  •  1
  • abjoshi - Reinstate Monica  · 技术社区  · 7 年前

    有人能帮我弄清楚这份声明吗?

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

    我似乎无法用给定的方法分析这些 here 什么 这意味着使用cdecl.org,而且第一个是非法的,但我想弄清楚 怎样 分析这些?

    2 回复  |  直到 7 年前
        1
  •  4
  •   John Bode    7 年前

    首先,一些基本规则:

    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 λ);

        2
  •  2
  •   user694733    7 年前

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

    typedef 作为:

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

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

    推荐文章