[英]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.