簡單理解函式宣告 以signal函式為例

2021-07-09 12:12:36 字數 1557 閱讀 1713

signal:幾乎所有c語言程式的實現過程中都要用到signal函式,作為捕獲不同步的一種方式。我們使用者要呼叫signal函式,可以這樣使用,首先在標頭檔案中加入:#include,然後我們可以這樣呼叫signal函式:signal(signal type,sighandler_t hander),這裡的signal type代表系統標頭檔案#include中某些常量,這些常量用來標識signal函式將要捕獲的訊號型別;sighander_t hander是當指定訊號發生時,將要加以呼叫的事件處理函式。signal函式返回的是指向處理函式(即hander)的指標,也就是它返回「乙個指向函式的指標」。

當然,我們今天的目的是函式宣告,有關signal函式就到這裡,這是「man signal」函式,我們可以看到它的宣告:

#include 

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

看吧,是不是比較難理解,那讓我們從hander(事件處理函式)入手,假設我們的事件處理函式是這樣的

void hander( int signum)

引數signum是乙個訊號值,我們可以先不管,那麼我們的 hander 函式可以這樣宣告:

void hander(int);
但是我們想用乙個指向hander函式的指標來代替hander,就假設它為 point ,所以就有*point = hander;那麼宣告又可以寫為:

void (*point)(int);
因為signal函式返回值型別與point的型別一樣(即hander的型別),那麼signal函式我們就可以這樣宣告:

void (*signal(arg,hander))(int); 【注意:函式名是乙個指向函式的指標,它就是函式入口】

在這裡,我們將(arg,hander)傳遞給signal函式,signal函式經過處理,返回乙個函式指標,指標指向的這個函式有乙個引數為(int)型別,它的返回值為void 型別,這不就是我們的hander函式嗎?對於signal中的arg不再作過多解釋,我們將hander 函式「帶入」,前面我們已經將hander函式宣告為void (*point)(int), 這兒的point可以在宣告時省略,也就是我們的signal函式可以這樣宣告了:

void  (*signal( int , void(*)(int)))(int);
我們也用typedef可以簡化上面的宣告:

typedef void (*sighander_t )(int) ;

sighander_t signal(int signum,sighander_t hander);

經過這樣乙個過程,有沒有對這個函式宣告有些理解呢?

理解函式宣告 signal函式的宣告

分兩步分析 假定變數fp是乙個函式指標,呼叫方法如下 fp 因為fp是乙個函式指標,那麼 fp就是該指標指向的函式,所以 fp 就是呼叫該函式的方式。ansi c標準允許程式設計師將上式簡寫為fp 的運算子高於 2.使用具體的函式指標替換fp,此處將0做型別強制轉換,轉換為函式指標,替換fp。對乙個...

如何理解signal函式宣告

signal函式用起來其實很簡單,但是回頭看看他的宣告,相信會有很多人表示費解。自己也在這個問題中糾結了好幾年了,今天終於弄明白,很是興奮,一起分享一下。先看函式原型 void signal int signo,void func int int 對於看慣了類似unsigned int sleep ...

signal函式宣告的理解

先看函式原型 void signal int signo,void func int int 對於看慣了類似unsigned int sleep unsigned int seconds 這種宣告的人們來說,signal的宣告到底是個啥啊?signal是個函式,後面應該是形參啊,但為什麼形參後面又來...