了解更高阶函数在C中的工作原理

时间:2017-01-29 10:14:01

标签: c function-pointers higher-order-functions

所以通常我会声明任何这样的函数指针:

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 Bug

2 个答案:

答案 0 :(得分:3)

CLion似乎有一个错误(可能)。函数名称的类型为size_t(const int *)。现在,由于函数可以隐式转换为函数指针,因此您的代码完全有效C。

CLion语法检查器可能不会考虑隐式转换。如果从函数名中明确获得函数指针,则错误应该消失:

hash_table_create(&hash_modulo); // Note the ampersand

答案 1 :(得分:2)

我认为问题在于您//to_f is for float salary= 2921.9121 puts salary.to_f.round(2) // to 2 decimal place puts salary.to_f.round() // to 3 decimal place 函数为typedef

const

以及您要作为HashTable *hash_table_create(const hash_function hash) 放入的其他功能未声明为parameters

const

编辑:

这在CodeBlocks中运行良好

改变这个:

size_t hash_modulo(const int *parameters)
size_t hash_universal(const int *parameters)

进入这个:

size_t hash_modulo(const int *parameters)
size_t hash_universal(const int *parameters)

然后这工作正常:

hash_function hash_modulo;
hash_function hash_universal;

以下评论中的说明。