"Candidate function not viable;" 将 C 库移植到 C++ 时出现问题

"Candidate function not viable;" Issues with porting a C library to C++

本文关键字:C++ 问题 function Candidate not viable      更新时间:2023-10-16

我试图在c++实现中使用c库,并且我经常遇到与"悬臂函数不可行的"有关的错误,并且它似乎认为库中的函数将无法与我代码中提供的参数一起工作。问题是,我的代码实际上是一个旧的实现(在c中),在c中编译时工作得很好。是否有一种方法可以使此编译作为我的c++环境的一部分?

下面是我得到的错误:

testbed/des-lsr_routinglogic.cpp:20:27: error: no matching function for call to 'dessert_periodic_add'
periodic_refresh_nh = dessert_periodic_add(refresh_list, NULL, NULL, &refresh_neighbor_t);
                      ^~~~~~~~~~~~~~~~~~~~
/usr/local/include/dessert.h:880:21: note: candidate function not viable: no known conversion from 'dessert_per_result_t ()' to 'dessert_periodiccallback_t *' (aka 'dessert_per_result_t (*)(void *, struct
  timeval *, struct timeval *)') for 1st argument
dessert_periodic_t* dessert_periodic_add(dessert_periodiccallback_t* c, void* data, const struct timeval* scheduled, const struct timeval* interval);
                ^

从这行代码code:

periodic_refresh_nh = dessert_periodic_add(refresh_list, NULL, NULL, &refresh_neighbor_t);

使用这个库的摘录:

dessert_periodic_t* dessert_periodic_add(dessert_periodiccallback_t* c, void* data,     const struct timeval* scheduled, const struct timeval* interval);
dessert_periodic_t* dessert_periodic_add_delayed(dessert_periodiccallback_t* c, void* data, int delay);
int dessert_periodic_del(dessert_periodic_t* p);
void dessert_register_ptr_name(void* ptr, const char* name);
const char* dessert_ptr2name(void* ptr);

我认为编译器的输出应该是不言而喻的任何有经验的c/c++组合,但它看起来像胡言乱语对我来说D:

编辑

谢谢,有人向我指出,我遗漏了一些重要的定义;refresh_list的定义:

 dessert_per_result_t refresh_list(void *data, struct timeval *scheduled, struct timeval *interval) {
pthread_rwlock_wrlock(&pp_rwlock);
node_neighbors_t *neighbor = dir_neighbors_head;
while (neighbor) {
    if (neighbor->entry_age-- == 0) {
        node_neighbors_t* el_to_delete = neighbor;
        HASH_DEL(dir_neighbors_head, el_to_delete);
        free(el_to_delete);
    } else {
        neighbor->weight = 1;
    }
    neighbor = neighbor->hh.next;
}
pthread_rwlock_unlock(&pp_rwlock);
return 0; }

甜品per_result_t:

 typedef enum _dessert_periodic_results { DESSERT_PER_KEEP = 0, DESSERT_PER_UNREGISTER = 1 } dessert_per_result_t;

dessert_periodiccallback_t的定义很奇怪;我会尽量贴出来的

c++对函数声明的要求比C严格。在本例中,函数refresh_list被声明为dessert_per_result_t refresh_list(),但dessert_periodic_add的第一个参数必须是一个指针,该指针指向具有显式指定形参类型的函数。

修复此问题的最佳方法是添加refresh_list的完整声明,与dessert_periodic_add所期望的相匹配,以取代它的缩写声明。

编译器消息显示编译器认为refresh_list是一个不带参数的函数,返回一个dessert_per_result_t

你发布的定义不同意。

这表明refresh_list有一个与定义不一致的单独声明

错误信息中显示的refresh_list的声明如下:

dessert_per_result_t refresh_list();

这在c++和C中意味着两种不同的东西。

在c++中,这意味着refresh_list不接受任何参数。

在C语言中,这意味着refresh_list接受未指定类型的未指定数量的参数。

这就是为什么它在C中工作,但在c++中,指向refresh_list的指针是不允许的,而指向dessert_per_result_t(void *, struct timeval *, struct timeval *)的指针是需要的。

参见:

  • 一劳永逸地理解C和c++中f()和f(void)的区别
  • 使用C void参数"void foo(void)"或者不"void foo()"?