簡體   English   中英

C中函數指針的遞歸聲明

[英]Recursive declaration of function pointer in C

我想聲明一個函數,該函數返回指向相同類型的函數的指針。

我想用它來實現如下所示的狀態機:

typedef event_handler_t (*event_handler_t)(event_t*); // compilation error

event_handler_t state2(event_t* e);
event_handler_t state1(event_t* e) {
    switch(e->type) {
    //...
    case SOME_EVENT:
        return state2;
    //...
    }

}
event_handler_t state2(event_t* e) {
    switch(e->type) {
    //...
    case OTHER_EVENT:
        return state1;
    //...
    }   
}

//...
event_handler_t event_handler;
//...
event_handler(&e);
//...

我設法使用以下結構來解決編譯錯誤:

typedef struct event_handler {
    struct event_handler (*func)(event_t *);
} event_handler_t;

但這使退貨聲明更加復雜:

event_handler_t state2(event_t* e) {
{
    event_handler_t next_handler = {NULL};
    switch(e->type) {
    //...
    case OTHER_EVENT:
        next_handler.func = state1;
        break;
    //...
    } 
    return next_handler;
}

我想知道是否有更好的方法在c中創建此類函數指針。

用C語言不可能做到這一點:函數不能返回指向自身的指針,因為類型聲明是遞歸擴展的,並且永遠不會結束。 請參閱此頁面以獲得說明: http : //www.gotw.ca/gotw/057.htm

上頁描述的解決方法是返回void (*) ()而不是正確鍵入的函數指針; 您的解決方法可以說有點整潔。

赫伯·薩特(Herb Sutter)的書《 更多例外的C ++》 (Item 32)中對此進行了討論,答案似乎是(對於C)“不是不使用強制轉換”。 對於C ++,通常可以通過引入類來提供一些額外的間接訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM