簡體   English   中英

參數列表中的C函數聲明

[英]C ­function declaration in a parameter list

我在C代碼中發現有點令人困惑的事情

struct SomeStruct {
    // ...
    void (*f)(const void *x);
};

void do_some( void f(const void *x) ) { // what?
    struct SomeStruct* v;
    // ...
    v->f = f;
}

我可以理解do_some取代函數而不是函數指針。 但是在實踐中,與void do_some( void (*f)(const void *x) )區別是什么? 什么時候應該用這個? 在C ++中允許這樣做嗎?

沒有區別。 這只是語法糖。 它在C和C ++中都是允許的。

函數參數簡單地由編譯器重寫為函數指針參數,就像編譯器將數組參數重寫為指針參數一樣。

作為參考,這里是C標准第3.7.1節的摘錄:

g(int (*funcp)(void))

// ...

or, equivalently, 

g(int func(void))

我可以理解do_some取代函數而不是函數指針。

不,作為函數參數,函數類型被調整為相應的函數指針類型。 參數f與成員f具有相同的函數指針類型。

但是在實踐中,與void do_some( void (*f)(const void *x) )區別是什么?

沒有任何。

什么時候應該用這個?

如果你喜歡額外的冗長。 或者在其他上下文中,例如聲明,您需要區分函數和指針類型。

在C ++中允許這樣做嗎?

對於函數參數(以及非類型模板參數),在C ++中應用相同的調整。

暫無
暫無

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

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