C syntax for functions returning function pointers

c, function-pointers

Solution

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

Problem

Consider the following typedefs : ``` typedef int (*f1)(float); typedef f1 (*f2)(double); typedef f2 (*f3)(int); ``` `f2` is a function that returns a function pointer. The same with `f3`, but the type of the function, the pointer to which `f3` returns, is `f2`. How can I define `f3` without the typedefs? I know typedefs are the cleaner and easier to understand way to define `f3`. However, my intention here is to understand C syntax better.

Original source

Related problems