2016-03-06 41 views
1

<signal.h>有如下的定義:SIG_IGN,SIG_DFL,SIG_ERR的定義

#define SIG_ERR (void (*)())-1

#define SIG_DFL (void (*)())0

#define SIG_IGN (void (*)())1

我覺得void (*)()意味着它是一個函數指針返回類型是void和參數是無效的(因爲括號之間有空)。

但是在signal()函數中,第二個參數類型是void (*func)(int)

那麼,爲什麼上面三件事的定義是void (*)()。而且,還有什麼意思是定義中的數字爲-101

如何解釋這些定義?

+0

這些是(小)整數值轉換爲pointer_to_function。該實現可以將它們與實際函數指針區分開來,因此它們將永遠不會被調用(不存在的函數將不會被調用),而是被視爲特殊的。而且您不必解釋這些值,只需使用符號常量即可。 – wildplasser

+0

可能重複[SIG \ _IGN宏定義中的數字1的含義是什麼?](http://stackoverflow.com/questions/35105452/what-s-the-meaning-of-the-number-1 -in-sig-ign-macro-definition) –

+0

你爲什麼要解釋這個文件?它可能包含實現內部部件,而不是看起來像有效的C代碼 –

回答

2

您的定義與我的定義不同。如果我預處理下列文件:

#include <signal.h> 
SIG_IGN 
SIG_DFL 
SIG_ERR 

最後3行的預處理器輸出是

% gcc -E sigtest.c|tail -n3 
((__sighandler_t) 1) 
((__sighandler_t) 0) 
((__sighandler_t) -1) 

和類型定義是

typedef __signalfn_t *__sighandler_t; 

typedef void __signalfn_t(int); 

asm-generic/signal-defs.h。所以一定是你有一些舊的標題。

但是,這不是C++,而是C中的空括號表示函數參數未聲明/函數可以接受任意數量的參數。自從C89標準以來,這已經被認爲是過時的。然而,類型void (*)()的值將與void (*)(int)兼容。


值-1,0和1是不可移植的魔術常量,它們僅對Linux內核有意義。