2014-01-12 22 views
1

我碰到一個函數調用鑄造一個地址的功能:使用「無效*作廢」

// call the entry point from the ELF header 
    // note: does not return! 
    ((void (*)(void)) (ELFHDR->e_entry & 0xFFFFFF))(); 

ELFHDR-> e_entry來是一個函數指針。我認爲((void (*)(void))是返回類型。但我不確定void * void是什麼類型。

是否有規則來說明這種類型?

謝謝!

+2

[螺旋規則](http://c-faq.com/decl/spiral.anderson.html)(仍然有從最後一個問題複製的鏈接,因爲它發生)。 – chris

+3

我喜歡你如何使用這個類型,然後隨意改變它,儘管不知道它是什麼或者它是什麼...... –

+1

「沒有理由」與尚未理解父類對於類型表達式的含義意義重大並且不能從單個元素中刪除...?這是最困難的最基本的錯誤。 – Leushenko

回答

2

你說, 「我認爲((void (*)(void))是返回類型」 - 它不是。這是表達式

(ELFHDR->e_entry & 0xFFFFFF) 

是一個指向一個函數的指針,它不接受任何參數並且不返回任何內容。

語句上的最後一個()通過該指針調用函數。

3
void (*)(void) 

是指向不帶參數且不返回任何值的函數的指針類型指針。

例如:

void foo(void) 
{ 
} 

void (*p)(void) = foo; // p is of type void (*)(void) 
1

你想要的工具是cdecl,翻譯C型成英文。在這種情況下,其轉換:

(void (*)(void)) 

到:

cast unknown_name into pointer to function (void) returning void