2015-09-23 27 views
1

我開始用Java編程,而且我是C/C++的新手,所以這對我來說是新的。typedef in C,這段代碼是什麼意思

在我的編碼任務之一,我碰到的語法如下:

typedef void function_name (void *param); 

我擡頭的typedef做什麼,我知道它的定義。但無法弄清楚上面的陳述意味着什麼。

接下來,這是使我更困惑的代碼。

static function_name some_func; 

有人可以對此有所瞭解嗎?

+1

它是C還是C++?下定決心。 – Brian

+0

其純C,抱歉的混淆。 :) – pranav3688

+1

http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work –

回答

1

只是爲了確保我們在同一頁面上。 typedef是一種創建實際引用舊類型的新類型的方法。例如,該線

typedef int time_t; 

創建一個新的類型time_t這只是該類型int的別名。這對於應用程序開發非常有用,因爲它允許我們封裝類型。例如,現在讓我們假設,在30年之後,我們意識到32位int類型不再足夠大以存儲時間值。有了良好的體系結構,我們可以改變這條線:

typedef long long int time_t; 

理論上一切都會很好,很花哨!

回到最初的問題。你看到的這行是類似於這個的typedef,但是有一些奇怪的語法。這種奇怪的語法是一種鍵入函數指針的方法 - 什麼是函數指針?函數指針是一種傳遞函數的方式,它允許代碼調用一個函數,而不必知道函數是什麼函數。

返回到typedef。它說「創建一個新類型function_name,使得它是接受void*作爲輸入並返回void的功能類別」。因此,新型號function_name是滿足這些要求的任何功能的類型(不返回任何內容,需要void*)。它讓我這樣寫代碼:

typedef void function_name (void* data); 

void my_function(void* data) // my_function has type function_name 
{ 
    printf("%p\n", data); 
} 

void invoke_twice(function_name fn, void* data) 
{ 
    fn(data); fn(data); 
} 

int main(int argc, char** argv) 
{ 
    invoke_twice(my_function, NULL); // my function _is_ a function 
    // should print 
    // 0x0 
    // 0x0 
} 

第二條語句

static function_name some_func; 

有點不解我爲什麼會有人這樣做。這是一種非常模糊的前向聲明函數的方式。換句話說,這句話相當於

void some_func(void* data); 

但是我是誰來判斷其他代碼。沒有完整的上下文,很難推斷此類設計決策背後的意圖。

+0

感謝您的詳細解釋! :) – pranav3688

4

這兩個聲明

typedef void function_name (void *param); 

static function_name some_func; 

相當於

static void some_func (void *param); 

對於聲明一個單一的功能,這是一個相當長的纏繞方法,但typedef將簡化聲明一堆的功能相同形狀

static function_name func1; 
static function_name func2; 
static function_name func3; 
static function_name func4; 

這是否是聲明清晰度的淨收益尚不清楚。但是,一個更加複雜的函數聲明很容易會有所幫助:

typedef struct some_st **(*func) (int v, char **a, int (*kw) (int p1, int p2)); 

這聲明func爲指針,以它返回一個間接指針結構和功能需要3個參數,其中最後一個是一個函數指針的函數。

+0

謝謝,這有助於..實際上{function_name}已被用於很多地方給定的代碼。 – pranav3688