void (*signal(int sig, void (*handler)(int)))(int) |
答題得分者是:harpist
|
yshihyu
一般會員 發表:23 回覆:18 積分:8 註冊:2006-11-28 發送簡訊給我 |
void (*signal(int sig, void (*handler)(int)))(int)
handler 可以看出是個函式指標 我看不懂的是 (*signal(int sig, void (*handler)(int))) 整個來看 又要怎麼解釋 signal ? 它是函式指標嗎? 看起來有像, 又感覺怪怪的 , 想知道這函式運作執行的過程是怎麼處理的? 謝謝 |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
真的有人會在自己的程式放這種東西嗎
<textarea cols="60" rows="10" class="cpp" name="code"> typedef void (*signal(int sig, void (*handler)(int abc)))(int xyz); typedef void (*signal2)(int xyz); //--------------------------------------------------------------------------- void XXsignal(int sig, void (*handler)(int abc))(int xyz) { // [C Error] UnitXX.cpp(14): E2091 Functions cannot return arrays or functions return 1; // [C Error] UnitXX.cpp(15): E2034 Cannot convert 'int' to 'void(int)' } //--------------------------------------------------------------------------- void XXsignal2(int xyz) { ShowMessage(xyz); } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { signal2 a=XXsignal2; a(100); } //--------------------------------------------------------------------------- </textarea><br /> 錯誤訊息如上註解, 由錯誤訊息可知 signal 是函式指標,只是其傳回型態是 void(int) 在 BCB(我用的是5)中並無法傳回這的型態。 abc, xyz 是我多加的,用意只在於那些都是宣告時用的假參數並不是主要宣告的名稱, 原 void (*signal(int sig, void (*handler)(int)))(int) 與 void (*signal(int, void (*)(int)))(int) 相同。 這種東西,個人建議,看看就好,不必花太多時間在上面,不實用,用了只是增加自己日後維護的負擔。
------
http://www.ViewMove.com |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
有啊。這個東西很有名耶。
只是我不知道在 windows 是不是有把它實做在裏面。 在 UNIX 中。如果你看那一個程式不爽。你可以下 kill -9 pid 可以把那個程式由系統中砍掉。 也就是像你在 windows 的工作管理員中把它強制移除一樣。 而這個 kill -9 pid 就是說把 9 這個數值送入 signal 這個函數 去處理。 所以你的程式不止是我們平時寫的那樣。還必須要寫收到這些值 要怎麼處理。在 unix 裏還有可以讓你的程式不用離開,可以要求它 ”從新載入"config 檔。等等這種安排。 你可以按 control F1 找 signal 就可以看到這個東西了。 它是標準C的東西。只是我再重申一次。我不知道 windows 對它的實作 到什麼程度。我在 unix 上,是有在使用這樣的功能。 |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
|
yshihyu
一般會員 發表:23 回覆:18 積分:8 註冊:2006-11-28 發送簡訊給我 |
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler); 相當於 void (*signal(int signum,void (*handler)(int)))(int); typedef void (*sighandler_t)(int); void signal( int signum, sighandler_t handler ); // 為何不這樣宣告? 感覺這樣比較正確 , 還是它有特殊用意? 因為宣告成 void * signal(int signum,void (*handler)(int))) (int) ; // 這邊的 signal 算是函式指標嗎? 感覺 ( int ) 完全用不到為何要這樣宣告? 謝謝 |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
harpist
資深會員 發表:3 回覆:251 積分:430 註冊:2002-10-03 發送簡訊給我 |
沒有那麼複雜, signal 函數是 ANSI C 所定義,這就是它的函式宣告
<textarea class="cpp" rows="10" cols="60" name="code">void (*signal(int sig, void (*handler)(int)))(int); </textarea> signal 是一個函式名稱而回傳值 void (*)(int) 也就是一個函式的位址,至於這個函式是什麼? 其實跟signal 函式的第二個參數有些關係,這個部分你去了解一下signal 這個函式的用途就 會知道了。 不曉得這個函式在windows下有什麼作用?倒是沒試過。不過在 UNIX / Linux 下 singal 卻是 很重要的東西,一種軟體中斷非常好用。 ===================引 用 yshihyu 文 章=================== typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 相當於 void (*signal(int signum,void (*handler)(int)))(int); ? typedef void (*sighandler_t)(int); void signal( int signum, sighandler_t handler?); // 為何不這樣宣告? 感覺這樣比較正確 , 還是它有特殊用意? 因為宣告成 void * signal(int signum,void (*handler)(int))) (int) ; // 這邊的 signal 算是函式指標嗎? 感覺 ( int?) 完全用不到為何要這樣宣告? 謝謝
------
~§~迷時師渡,悟了自渡~§~
編輯記錄
harpist 重新編輯於 2007-07-04 01:01:35, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |