我試圖理解這段代碼是從Tcl documentation瞭解ç的typedef
typedef int Tcl_DriverOutputProc(
ClientData instanceData,
const char *buf,
int toWrite,
int *errorCodePtr);
據我所知的typedef的目的是分配選擇的名稱以現有的類型,那麼爲什麼是需要的typedef的int 功能?這可以如何使用?
我試圖理解這段代碼是從Tcl documentation瞭解ç的typedef
typedef int Tcl_DriverOutputProc(
ClientData instanceData,
const char *buf,
int toWrite,
int *errorCodePtr);
據我所知的typedef的目的是分配選擇的名稱以現有的類型,那麼爲什麼是需要的typedef的int 功能?這可以如何使用?
我知道的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使用該功能。
哇,不知道你可以在* C *中爲一個實際的函數類型(與普通的指針函數typedef相比)做一個typedef。但我猜在* C *中唯一可能的用例確實是創建指針變量(因此通常的方法是首先在類型上指定指針類型)。但仍然很高興知道。 –
@ChristianRau:您還可以使用功能的typedef聲明函數,但你仍然需要正常功能,聲明語法當你定義它;而在C++中,函數類型通常用作模板參數(例如'std :: function
是的,最終* C++ *更多地使用*類型*,無論是超載,模板,...我認爲這個* function-type *語法是一個* C++ 11 *的新手,引入了諸如'std :: result_of'和'std :: function'之類的東西。還有一些需要了解的舊* C *;) –
函數類型的typedefs語法更爲奇怪 - 您創建的類型名稱出現在中間中。正如Mike Seymour已經說過的那樣,它將名稱Tcl_DriverOutputProc
分配給功能類型int(ClientData, const char *, int, int *)
。
好吧,很奇怪......它出現在函數名稱出現在非typedef聲明中的完全相同的地方。 – Angew
的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;
它被用來聲明[函數指針(http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work)在TCL_CHANNELTYPE – alexrider
你覺得什麼this(typedef int(* hello)(void);)? – MYMNeo