2013-04-17 54 views
12

我試圖理解這段代碼是從Tcl documentation瞭解ç的typedef

typedef int Tcl_DriverOutputProc(
     ClientData instanceData, 
     const char *buf, 
     int toWrite, 
     int *errorCodePtr); 

據我所知的typedef的目的是分配選擇的名稱以現有的類型,那麼爲什麼是需要的typedef的int 功能?這可以如何使用?

+0

它被用來聲明[函數指針(http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work)在TCL_CHANNELTYPE – alexrider

+0

你覺得什麼this(typedef int(* hello)(void);)? – MYMNeo

回答

16

我知道的typedef的目的是分配選擇的名稱以現有各類

沒錯。函數具有類型,並將名稱Tcl_DriverOutputProc分配給此函數類型。函數類型本身是這樣寫的名稱缺少的功能:

int(ClientData, const char *, int, int *) 

,並與函數聲明,您可以包括名稱爲參數,或讓他們出來,任您選擇。

這是如何使用的?

您可以使用指向函數的指針來指定運行時的行爲;如:

typedef void function(); 
void hello() {printf("Hello\n");} 
void goodbye() {printf("Goodbye\n");} 

int main() { 
    function * pf = hello; 
    pf(); // prints "Hello" 
    pf = goodbye; 
    pg(); // prints "Goodbye" 
} 

在這種情況下,它可以讓你寫一個函數來處理TCL輸出的某些方面,並告訴TCL使用該功能。

+0

哇,不知道你可以在* C *中爲一個實際的函數類型(與普通的指針函數typedef相比)做一個typedef。但我猜在* C *中唯一可能的用例確實是創建指針變量(因此通常的方法是首先在類型上指定指針類型)。但仍然很高興知道。 –

+2

@ChristianRau:您還可以使用功能的typedef聲明函數,但你仍然需要正常功能,聲明語法當你定義它;而在C++中,函數類型通常用作模板參數(例如'std :: function ')。 –

+0

是的,最終* C++ *更多地使用*類型*,無論是超載,模板,...我認爲這個* function-type *語法是一個* C++ 11 *的新手,引入了諸如'std :: result_of'和'std :: function'之類的東西。還有一些需要了解的舊* C *;) –

0

函數類型的typedefs語法更爲奇怪 - 您創建的類型名稱出現在中間中。正如Mike Seymour已經說過的那樣,它將名稱Tcl_DriverOutputProc分配給功能類型int(ClientData, const char *, int, int *)

+2

好吧,很奇怪......它出現在函數名稱出現在非typedef聲明中的完全相同的地方。 – Angew

3

的typedef也可以用於聲明函數說「函數名」,這「函數名」可被用於聲明與相似類型和參數另一功能。

typedef function_name(int, int); 

function_name function1; 
function_name *function2; 

這裏,在你的情況下,typedef語句用於聲明「Tcl_DriverOutputProc」函數。在「struct Tcl_ChannelType」中使用「Tcl_DriverOutputProc」來聲明「* outputProc」。

「struct Tcl_ChannelType」位於Tcl文檔的最後。

typedef struct Tcl_ChannelType { 
    const char *typeName; 
    Tcl_ChannelTypeVersion version; 
    Tcl_ DriverCloseProc *closeProc; 
    Tcl_DriverInputProc *inputProc; 
    Tcl_DriverOutputProc *outputProc; // <-- DriverOutputproc is used here. 
    Tcl_DriverSeekProc *seekProc; 
    Tcl_DriverSetOptionProc *setOptionProc; 
    Tcl_DriverGetOptionProc *getOptionProc; 
    Tcl_DriverWatchProc *watchProc; 
    Tcl_DriverGetHandleProc *getHandleProc; 
    Tcl_DriverClose2Proc *close2Proc; 
    Tcl_DriverBlockModeProc *blockModeProc; 
    Tcl_DriverFlushProc *flushProc; 
    Tcl_DriverHandlerProc *handlerProc; 
    Tcl_DriverTruncateProc *truncateProc; 
}Tcl_ChannelType;