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