对typedef void (*sighandler_t)(int)的理解(声明了一种类型:sighandler_t)
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
此處由于加了typedef自定義了一個新類型sighandler_t,所以第二行的函數原型看起來順眼多了,形式跟int func(char c, int i)無異,但是如果看不懂typedef語句,這兩句話仍然是噩夢。
要理解typedef,只要記住一句話就差不多了,那就是:typedef在語句中所起的作用只不過是把語句原先定義變量的功能變成了定義類型的功能而已。我們只消看幾個例子立即明白。
例如語句?typedef int *apple;?理解它的正確步驟是這樣的:先別看typedef,就剩下int *apple; 這個語句再簡單不過,就是聲明了一個指向整型變量的指針apple?(注意:定義只是一種特殊的聲明),加上typedef之后就解釋成聲明了一種指向整型變量指針的類型apple?。
現在,回過來看上面的這個函數原型?typedef void (*sighandler_t)(int),蓋住?typedef不看?,再簡單不過,sighandler_t就是一個函數指針,指向的函數接受一個整型參數并返回一個無類型指針?。加上typedef之后sighandler_t就是一種新的類型,就可以像int一樣地去用它,不同的是它聲明是一種函數指針,這種指針指向的函數接受一個整型參數并返回一個無類型指針?。怎么樣?簡單吧。
再來做一個更酷的練習,請看:typedef char *(* c[10])(int **p);
去 掉typedef就變成char *(* c[10])(int **p),先不管這個語句有多難看,它一定是聲明了一個擁有10個元素的數組c對不對?okay沒什么了不起的,只不過這個數組c的元素有點特別,它們都是函數指針,并且它們所指向的這些函數統統都接受一個二級指針然后返回一直指向字符型的指針。加上typedef之后,c就不是一個數組了,而是一種類型了,什么類型現在你能說出來了吧。 ^_^
轉自:http://blog.sina.com.cn/s/blog_7090a2d1010163ol.html
signal函數的功能:
為指定的信號安裝一個新的信號處理函數。
#include <signal.h>
void (*signal(int signo, void (func)(int)))(int);
復雜原型分開看:
void ( signal( int signo, void (*func)(int) ) )(int);
函數名 :signal
函數參數 :int signo, void (func)(int)
返回值類型:void ()(int);
上面所示的signal函數原型太復雜了,如果使用下面的typedef,則可使其簡單一些:
typedef void Sigfunc(int);
然后,可將signal函數原型寫成:
Sigfunc *signal(int,Sigfunc *);
也可以:
Typedef void (*sigfunc ) (int);
然后,可將signal函數原型寫成:
Sigfunc signal(int,sigfunc);
1. 關于typedef
typedef作為類型定義關鍵字,用于在原有數據類型(基本類型、構造類型、指針等)的基礎上,由用戶自定義新的類型名稱。typedef聲明不是用于創建一個新類型,而是為某個已經存在的類型增加一個新的名字罷了。
一般,使用typedef定義另一個名稱是出于可移植性的考慮。這個在嵌入式編程中使用較多。比如,某些基本數據類型在不同的處理器中的表示位數可能不同,如果要將程序移植到另一種體系結構的處理器上工作,那么勢必要修改大量的代碼而且容易出錯。如果將它取一個新名稱,然后在程序中使用新的名稱來表示,那么移植的工作僅僅只是修改定義這些新名詞即可。比如,只需將typedef int INT16; 替換成 typedef short INT16; 和 typedef short INT16; 替換成 typedef int INT32; 即可。
在變量定義的前面加上typedef,即可定義該變量的類型。比如, long count; 這里定義了一個長整型變量count,當加上typedef后, typedef long count; 那么count就成為了long類型。
在這里,typedef void (*sighandler_t)(int) ,typedef 在語句中所起的作用不過就是把語句原先定義變量的功能變成了定義類型的功能而已。
2. #define和typedef
define和typedef的作用看起來很像,不過差別缺很大。#define僅在預處理時對代碼進行簡單的字符串替換處理,不作正確性檢查,不關含義是否正確照樣替換;而typedef是在編譯時處理,它建立了一個新的數據類型別名。一般來說,最好使用typedef定義用戶類型,部分原因是它能正確處理指針類型。
以上部分來源:https://blog.csdn.net/xingxu0207/article/details/65443971
UNIX系統的信號機制最簡單的接口是signal函數。
總結
以上是生活随笔為你收集整理的对typedef void (*sighandler_t)(int)的理解(声明了一种类型:sighandler_t)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux的目录结构和头文件相关;哪里找
- 下一篇: Linux中makefile项目管理