2015-12-04 522 views
0

我想了解哪些有如下的代碼:C - 使用不帶參數的參數調用函數聲明?

void terminate_pipe(int); 
code code code... 
struct sigaction new_Sigiterm; 
new_Sigiterm.sa_handler = terminate_pipe; 

我的問題是:

  • 什麼是調用這樣的功能是什麼意思?是否 只是把NULL作爲參數?

  • 這是無效的,所以new_Sigiterm.sa_handler將是NULL不管是什麼?

謝謝。

+1

函數沒有被調用;一個沒有括號的函數名通常意味着你正在處理一個函數_pointer_。你問題中的代碼只是將'terminate_pipe'的地址賦給'struct sigaction'中的'sa_handler'字段。在這裏看到更多的信息:http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work – szczurcio

+0

我不認爲這是這裏的情況。該函數是: 空隙terminate_pipe(INT){ *代碼* } 其絕對函數的簽名。你爲什麼認爲它是函數指針? –

+0

的確如此。請看看我與你聯繫的問題(和答案)。 – szczurcio

回答

3

new_Sigiterm.sa_handler很可能是指向函數的指針。通過運行

new_Sigiterm.sa_handler = terminate_pipe; 

它類似於說

new_Sigiterm.sa_handler = &terminate_pipe; 

(像指針)。這不是運行這個函數,它只是創建一個指向該函數的指針,如果你「運行」指針,那麼指向的函數將會運行。

這是如何聲明函數指針:

void function(int x); 

int main() 
{ 
    //Pointer to function 
    void (*foo) (int); 

    //Point it to our function 
    foo = function; 

    //Run our pointed function 
    foo(5); 
} 

More info about function pointers

1

類似這個任務的代碼是設置一個處理程序(有時稱爲函數指針):基本上是在給定時間運行的函數的地址。

這個在C中的語法是命名該函數,但不要在末尾放置()。這返回該函數的地址。

new_Sigiterm.sa_handler = terminate_pipe; 
+0

請注意,您也可以執行'&terminate_pipe';在這種情況下沒有區別。 – szczurcio

+0

sa_handler字段是可以放置函數地址的地方。 – TakUnderhand

+0

對不起,我是一個java程序員,現在我很困惑。 sa_handler字段是...一個函數字段?而代碼是「覆蓋」它呢? –