2014-03-12 137 views
1

我正在學習APUE 10.3信號,只是混淆了SIG_ERR,SIG_DFLSIG_IGN的定義。這裏的定義是:APUE 10.3信號:指針投射問題。

#define SIG_ERR (void (*)())-1 
#define SIG_DFL (void (*)())0 
#define SIG_IGN (void (*)())1 

這裏是信號函數原型:

void (*signal(int signo, void (*func)(int)))(int) 

當我們調用signal(signo, SIG_DFL),爲什麼會存在,因爲第二個參數沒有函數失配問題,應該是void (*)(int)),然而,是什麼我們提供的SIG_DFL(void (*)()),void (*)(int))(void (*)())的類型?

回答

1

一個聲明如下的函數:type function()意味着你沒有指定該函數的參數,所以你可以用任何參數或無參數調用該函數。事實上,這只是告訴編譯器忽略該函數的參數的類型檢查,因爲你不使用它們。 聲明不帶參數的函數的正確方法是type function(void)

所以,實際上,當類型檢查void (*)())void (*)(int)),編譯器只檢查返回值類型。

請注意,它不是在C++中,只在C中。在C++中,type function()相當於type function(void)

您可以查看官方C99規格here。功能定義在6.9.1,第141頁。

+0

感謝所有球員的幫助。請讓我知道它的證據嗎?我的意思是我能夠學習它的書籍,文檔或規格? – kevin

+0

我添加了規格 – FreeSalad

0

空括號()在函數聲明中意味着函數可以帶未指定的參數。請不要混淆void這個描述沒有參數的論點。

1

雖然這將在C(這裏沒有明確void參數的函數採用的不確定類型參數的數目不確定)沒事的,這些定義不會用C++工作。

但是,雖然您可能在書中找到了這些內容,但它們並不以真正的系統形式存在,僅僅是因爲它也必須以C++工作。例如,我的Linux系統上我有

#define SIG_DFL ((__sighandler_t) 0 

其中__sighandler_t

typedef void (*__sighandler_t) (int);