2014-06-05 122 views

回答

8
typedef int driver_filter_t(void*); 

這是一個函數類型的定義。它使driver_filter_t成爲可被描述爲「函數返回int,類型指針參數爲void」的類型的別名。

至於所有typedef s,它爲現有類型創建別名,而不是新類型。

driver_filter_t不是指針類型。你不能聲明類型爲driver_filter_t的東西(該語法不允許使用typedef名稱聲明函數)。你可以聲明一個對象,這是一個函數指針,例如:

driver_filter_t *func_ptr; 

因爲你不能沒有添加*表示指針類型直接使用的函數類型的名稱,它可能更常見的定義typedef小號對於函數指針類型,例如:

typedef int (*driver_filter_pointer)(void*); 

但是對於函數類型的typedefs是完全合法的,我個人覺得它們更清晰。

+0

很好的答案。我希望K&R在他們的書中更多地關注這類事情,而不是通過語言衝刺。 實際上,使用函數類型的typedef和函數指針的typedef會有什麼區別,因爲無論如何你都會處理指針?對於前者你有什麼可以做的,你不能對後者做什麼? 非常感謝! – Martin

1

typedef int driver_filter_t(void*);是一個函數類型的typedef。在C中,您可以將它用於函數指針,如driver_filter_t* fn_ptr

在C++中也可以使用該類型定義來聲明成員函數(但不執行這些):

struct Some { 
    driver_filter_t foo; // int foo(void*); 
    driver_filter_t bar; // int bar(void*); 
}; 
+2

嗨Maxim。只是我的意見,但是OP專門爲C標記了這個問題。有趣的是,您可以在展示時爲C++聲明成員函數。但是,我認爲這可能會導致熟悉C語言的人感到困惑 - 尤其是因爲您不能在C語言中使用該語法。 –

+0

@embedded_guy困惑的人會在這裏澄清他們。 –

+1

您也可以使用typedef來代替C中的函數聲明,例如'driver_filter_t filterA,filterB,filterC;'代替'int filterA(void *); int filterB(void *); ...' – tab

相關問題