関数宣言の簡単な理解(signal関数を例に)
この2,3日、signal関数などの宣言が複雑な関数に遭遇しました.では、signal関数の使い方を簡単に説明します.(『cトラップと欠陥』を参照)
signal:ほとんどのc言語プログラムの実装ではsignal関数が使用され、同期しない方法をキャプチャします.私たちのユーザーはsignal関数を呼び出します.このように使用することができます.まず、ヘッダファイルに
もちろん、今日の目的は関数宣言です.signal関数についてはここまでです.これは「man signal」関数です.その宣言を見ることができます.
わかりにくいのではないでしょうか.hander(イベント処理関数)から始めましょう.私たちのイベント処理関数がそうであると仮定します.
パラメータsignumは信号値であり、hander関数はこのように宣言することができます.
しかし、handerの代わりにhander関数を指すポインタを使用したい場合は、pointと仮定すると、*point=handerがあります.声明は次のように書くことができます.
signal関数の戻り値タイプはpointのタイプと同じ(handerのタイプ)であるため、signal関数はこのように宣言することができます.
void (*signal(arg,hander))(int); 【注意:関数名は関数を指すポインタであり、関数エントリである】
ここではsignal関数に(arg,hander)を渡し,signal関数を処理して関数ポインタを返し,ポインタが指すこの関数には(int)タイプのパラメータがあり、その戻り値はvoidタイプです.これが私たちのhander関数ではありませんか.signalのargについてあまり説明しないで、hander関数を「持ち込み」します.前にhander関数を
typedefを使用すると、上記の宣言を簡略化できます.
このような過程を経て、この関数の宣言に少し理解しましたか?
signal:ほとんどのc言語プログラムの実装ではsignal関数が使用され、同期しない方法をキャプチャします.私たちのユーザーはsignal関数を呼び出します.このように使用することができます.まず、ヘッダファイルに
#include<signal.h>
を追加します.次に、signal関数を呼び出すことができます.signal(signal type,sighandler_t hander)
は、システムヘッダファイルsignal type
のいくつかの定数を表し、signal関数がキャプチャする信号タイプを識別するために使用されます.#include<signal.h>
は、指定された信号が発生したときに呼び出されるイベント処理関数である.signal関数は、処理関数(hander)を指すポインタ、すなわち「関数を指すポインタ」を返します.もちろん、今日の目的は関数宣言です.signal関数についてはここまでです.これは「man signal」関数です.その宣言を見ることができます.
#include <signal.h>
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); 【注意:関数名は関数を指すポインタであり、関数エントリである】
ここではsignal関数に(arg,hander)を渡し,signal関数を処理して関数ポインタを返し,ポインタが指すこの関数には(int)タイプのパラメータがあり、その戻り値はvoidタイプです.これが私たちのhander関数ではありませんか.signalのargについてあまり説明しないで、hander関数を「持ち込み」します.前にhander関数を
sighander_t hander
と宣言しましたが、ここのpointは宣言時に省略することができます.つまり、signal関数はこのように宣言することができます.void (*signal( int , void(*)(int)))(int);
typedefを使用すると、上記の宣言を簡略化できます.
typedef void (*sighander_t )(int) ;
sighander_t signal(int signum,sighander_t hander);
このような過程を経て、この関数の宣言に少し理解しましたか?