C syntax for functions returning function pointers

前端 未结 6 756
小蘑菇
小蘑菇 2020-12-02 04:49

Consider the following typedefs :

typedef int (*f1)(float);
typedef f1 (*f2)(double);
typedef f2 (*f3)(int);

f2 is a function

6条回答
  •  猫巷女王i
    2020-12-02 05:17

    Start with your declaration for f1:

    int (*f1)(float);
    

    You want f2 to be a pointer to a function returning f1, so substitute f1 in the declaration above with the declaration for f2:

    int (*      f1     )(float);
                |
          +-----+-----+
          |           |
          v           v
    int (*(*f2)(double))(float);
    

    The declaration reads as

            f2                   -- f2
           *f2                   -- is a pointer
          (*f2)(      )          -- to a function
          (*f2)(double)          --   taking a double parameter
         *(*f2)(double)          --   returning a pointer
        (*(*f2)(double))(     )  --   to a function
        (*(*f2)(double))(float)  --     taking a float parameter
    int (*(*f2)(double))(float)  --     returning int
    

    You repeat the process for f3:

    int (*(*    f2    )(double))(float);
                |
            +---+----+
            |        |
            v        v
    int (*(*(*f3)(int))(double))(float);
    

    which reads as

              f3                           -- f3
             *f3                           -- is a pointer
            (*f3)(   )                     -- to a function
            (*f3)(int)                     --   taking an int parameter
           *(*f3)(int)                     --   returning a pointer
          (*(*f3)(int))(      )            --   to a function
          (*(*f3)(int))(double)            --     taking a double parameter
         *(*(*f3)(int))(double)            --     returning a pointer
        (*(*(*f3)(int))(double))(     )    --     to a function
        (*(*(*f3)(int))(double))(float)    --       taking a float parameter
    int (*(*(*f3)(int))(double))(float);   --       returning int
    

提交回复
热议问题