我開始用Java編程,而且我是C/C++的新手,所以這對我來說是新的。typedef in C,這段代碼是什麼意思
在我的編碼任務之一,我碰到的語法如下:
typedef void function_name (void *param);
我擡頭的typedef做什麼,我知道它的定義。但無法弄清楚上面的陳述意味着什麼。
接下來,這是使我更困惑的代碼。
static function_name some_func;
有人可以對此有所瞭解嗎?
我開始用Java編程,而且我是C/C++的新手,所以這對我來說是新的。typedef in C,這段代碼是什麼意思
在我的編碼任務之一,我碰到的語法如下:
typedef void function_name (void *param);
我擡頭的typedef做什麼,我知道它的定義。但無法弄清楚上面的陳述意味着什麼。
接下來,這是使我更困惑的代碼。
static function_name some_func;
有人可以對此有所瞭解嗎?
只是爲了確保我們在同一頁面上。 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);
但是我是誰來判斷其他代碼。沒有完整的上下文,很難推斷此類設計決策背後的意圖。
感謝您的詳細解釋! :) – pranav3688
這兩個聲明
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個參數,其中最後一個是一個函數指針的函數。
謝謝,這有助於..實際上{function_name}已被用於很多地方給定的代碼。 – pranav3688
它是C還是C++?下定決心。 – Brian
其純C,抱歉的混淆。 :) – pranav3688
http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work –