[英]Understanding how higher order functions work in C
所以通常我會像這樣聲明任何函數指針:
typedef size_t (*hash_function)(const int *);
然后在另一個函數中使用它
HashTable *hash_table_create(const hash_function hash)
所以對於任何滿足 hash_function 定義的函數,如
size_t hash_modulo(const int *parameters)
size_t hash_universal(const int *parameters)
...
我可以將它們用作參數
hash_table_create(hash_modulo)
問題是:我的 IDE (Clion) 抱怨這種情況下的參數不匹配(代碼有效)。 具體來說,它似乎不接受將hash_function
作為參數類型傳遞,但如果我使用size_t (*hash_function)(const int *)
代替,它會接受。 我在這里缺少什么?
我的代碼是對的而我的 IDE 是錯的,反之亦然?
提前致謝!
編輯 1:確切的錯誤消息是: Types 'hash_function' and size_t(const int *)' are not compatible
編輯 2:這似乎是一個 Clion錯誤
CLion 似乎有一個錯誤(可能)。 函數名稱的類型為size_t(const int *)
。 現在,由於函數可以隱式轉換為函數指針,因此您的代碼是完全有效的 C。
CLion 語法檢查器可能不會考慮隱式轉換。 如果您從函數名稱中顯式獲取函數指針,則錯誤應該消失:
hash_table_create(&hash_modulo); // Note the ampersand
我認為問題在於您將函數typedef
為const
HashTable *hash_table_create(const hash_function hash)
並且您想作為parameters
放入的其他函數未聲明為const
size_t hash_modulo(const int *parameters)
size_t hash_universal(const int *parameters)
編輯:
這在 CodeBlocks 中工作正常
改變這個:
size_t hash_modulo(const int *parameters)
size_t hash_universal(const int *parameters)
進入這個:
hash_function hash_modulo;
hash_function hash_universal;
然后這個工作正常:
hash_table_create(hash_modulo);
hash_table_create(hash_universal);
在下面的評論中解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.