Wednesday, December 29, 2021

C 指標入門 考試3

What is the last (int) doing? 

Consider the signal() function from the C standard:

void ( *signal(int sig, void (*handler)(int)) ) (int);


The whole thing declares a function called signal:

  • signal takes an int and a function pointer
    • this function pointer takes an int and returns void
  • signal returns a function pointer
    • this function pointer takes an int and returns a void

That's where the last int comes in.


        signal                                          -- signal

        signal(                               )         -- is a function

        signal(    sig                        )         -- with a parameter named sig

        signal(int sig,                       )         --   of type int

        signal(int sig,        handler        )         -- and a parameter named handler

        signal(int sig,       *handler        )         --   which is a pointer

        signal(int sig,      (*handler)(   )) )         --   to a function

        signal(int sig,      (*handler)(int)) )         --   taking an int parameter

        signal(int sig, void (*handler)(int)) )         --   and returning void

       *signal(int sig, void (*handler)(int)) )         -- returning a pointer

     ( *signal(int sig, void (*handler)(int)) )(   )    -- to a function

     ( *signal(int sig, void (*handler)(int)) )(int)    --   taking an int parameter

void ( *signal(int sig, void (*handler)(int)) )(int);   --   and returning void


You can use the spiral rule to make sense of such declarations, or the program cdecl(1)


If you write:

typedef void (*SignalHandler)(int signum);


then you can instead declare signal() as:

extern  SignalHandler signal(int signum, SignalHandler handler);

No comments:

Post a Comment

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能