我很新的C,和我有一個很艱難的時間閱讀這行代碼,並理解它:在C中使用函數指針的Typedef?
typedef void (*getnxtbyte_t)(void *stream);
環視,我現在知道,它是一個指針指向一個函數。但有誰能幫我進一步澄清這一點?這種新型的名稱是什麼?它指向什麼功能?是功能(void* stream)
的參數嗎?
在此先感謝!
我很新的C,和我有一個很艱難的時間閱讀這行代碼,並理解它:在C中使用函數指針的Typedef?
typedef void (*getnxtbyte_t)(void *stream);
環視,我現在知道,它是一個指針指向一個函數。但有誰能幫我進一步澄清這一點?這種新型的名稱是什麼?它指向什麼功能?是功能(void* stream)
的參數嗎?
在此先感謝!
這是一個棘手的語法習慣。
這種新型的名稱是什麼?
該類型是getnxtbyte_t
。 (你可以讀到尾_t
作爲「類型」,這是一個通用的慣例。)
getnxtbyte_t
類型的變量可以帶一個void *
參數和具有返回類型void
一個函數的地址。
它指的是什麼功能?
錯誤的問題。
該代碼僅僅是定義了的類型。沒有變量創建,所以沒有「它」指向任何東西。
如果你知道正確的簽名的功能,如:
void some_func(void*) {}
您現在可以使用的typedef創建一個指向它:
getnxtbyte_t my_function_pointer = some_func;
這typedef
創建一個名爲類型getnxtbyte_t
。該類型用於返回void
(即無)的函數的指針,如第二個單詞所示。該功能採用單個參數,該參數爲void *
,如stream
所示。
所以,如果你有這樣的聲明,有一個功能:
void some_function(void *any_name);
那麼你可以使用一個typedef
像在您的文章:
void *some_param = NULL;
typedef void (*getnxtbyte_t)(void *stream); // declare typedef
getnxtbyte_t func = some_function; // assign
func(some_param); // call
函數指針類型名稱爲getnxtbyte_t
。它現在沒有指向任何東西 - 這是一個類型的指針,而不是一個實際的指針。這就像說
typedef struct foo {int x;} Foo;
你定義一個類型Foo
,但該類型的沒有實際的實例。最後,是的,該函數採用一個void*
參數,並返回void
。
我也是C新手,所以如果有任何錯誤,請糾正我。
一個指向函數的指針被格式化,像這樣:
datatype (*POINTER_NAME)(PARAMETERS);
所以這是數據類型針對性的函數返回時,指針的名稱和參數有針對性的功能。
這裏是一個函數指針看起來多麼相比普通函數聲明:
// normal function declaration
void getnxtbyte_t(void *stream);
// function pointer
void (*getnxtbyte_t)(void *stream);
typedef
使我們能夠創造我們自己的類型。
// will create a type called getnxtbyte_t
typedef void (*getnxtbyte_t)(void *stream);
在這一點上,我們只是聲明瞭一個類型;我們沒有指向任何東西。因此,讓我們創建一個名爲func_ptr
的指針並將其指向一個函數。
// func_ptr is a pointer of type getnxtbyte_t
getnxtbyte_t func_ptr = another_function;
// calling func_ptr is now the same as calling another_function
func_ptr(an_argument);
// had we not used typedef, we would type:
void (*getnxtbyte_t)(void *stream) = another_func;
getnxtbyte_t(an_argument);
請參閱鏈接[此答案](http://stackoverflow.com/a/8249710/968261)中的文章。 – 2012-01-17 19:22:30
[這個C語句是什麼意思?]的可能重複(http://stackoverflow.com/questions/8249483/what-does-this-c-statement-mean) – 2012-01-17 19:23:06