2013-01-08 86 views
2

下面的代碼編譯,的sigaction兩個結構和功能

struct sigaction sa; 
memset (&sa, 0, sizeof (sa)); 
sa.sa_handler = &handler; 
sigaction (SIGRTMIN + 5, &sa, NULL); 

但如果我忽略struct它給我的錯誤:

expected ';' before 'sa'

我使用C++中使用struct關鍵字不練琴。

當我使用struct時它是如何工作的。

+1

這看起來像你實際上同時擁有一個'struct sigaction'和一個聲明的函數'sigaction'。在這種情況下,編譯器無法知道你的意思是第一行中的'struct',除非你告訴它。 – Angew

+1

的確,有很多種語句/表達式在不知道哪個標識符是類型的情況下會不明確。所以編譯器不能猜測你是否在使用'sigaction'來表示類型或函數,你必須告訴它。這也是在模板中依賴類型之前的'typename'的原因。 –

回答

7

在C語言中,結構標籤名稱與其他 名稱不同,因此它們不會發生衝突。在C++中,語言中有一種特殊的 支持:除了通常的 函數重載,您可以在同一個作用域中有兩個相同的符號,提供一個是類型名稱,指定類類型 或者一個類型名稱 枚舉。當名稱擡頭,編譯器將 選擇其中之一是類型名稱,除非該名 緊跟一個類的關鍵字(classstructunion) 或關鍵字enum

+0

我也嘗試過int,它工作,謝謝你這麼好的解釋 – Deepak