2012-01-17 48 views
2

我很新的C,和我有一個很艱難的時間閱讀這行代碼,並理解它:在C中使用函數指針的Typedef?

typedef void (*getnxtbyte_t)(void *stream); 

環視,我現在知道,它是一個指針指向一個函數。但有誰能幫我進一步澄清這一點?這種新型的名稱是什麼?它指向什麼功能?是功能(void* stream)的參數嗎?

在此先感謝!

+0

請參閱鏈接[此答案](http://stackoverflow.com/a/8249710/968261)中的文章。 – 2012-01-17 19:22:30

+0

[這個C語句是什麼意思?]的可能重複(http://stackoverflow.com/questions/8249483/what-does-this-c-statement-mean) – 2012-01-17 19:23:06

回答

5

這是一個棘手的語法習慣。

這種新型的名稱是什麼?

該類型是getnxtbyte_t。 (你可以讀到尾_t作爲「類型」,這是一個通用的慣例。)

getnxtbyte_t類型的變量可以帶一個void *參數和具有返回類型void一個函數的地址。

它指的是什麼功能?

錯誤的問題。

該代碼僅僅是定義了的類型。沒有變量創建,所以沒有「它」指向任何東西。

如果你知道正確的簽名的功能,如:

void some_func(void*) {} 

您現在可以使用的typedef創建一個指向它:

getnxtbyte_t my_function_pointer = some_func; 
1

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 
0

函數指針類型名稱爲getnxtbyte_t 。它現在沒有指向任何東西 - 這是一個類型的指針,而不是一個實際的指針。這就像說

typedef struct foo {int x;} Foo; 

你定義一個類型Foo,但該類型的沒有實際的實例。最後,是的,該函數採用一個void*參數,並返回void

0

我也是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);