阻止编译器在具有遗留C代码的C ++代码中生成错误

时间:2011-09-08 18:52:57

标签: c++ c compiler-errors

我正在将遗留的C程序移植到C ++。但是,编译器并不满意,需要对C ++进行额外的类型转换。例如,我有这个功能......

 void foreach_element_in_patch(Patch *patch, void (*func)(), 
long arg1, long process_id);

在原始C代码中,它就像这样使用......

 foreach_element_in_patch( patch, display_interactions_in_element, 
mode, process_id );

但是,对于C ++,我需要对第二个参数进行类型转换,以阻止编译器产生错误。

 foreach_element_in_patch( patch, (void (*)())display_interactions_in_element, 
mode, process_id );

编译器生成的错误如下......

invalid conversion from ‘void (*)(Patch*, long int, long int)’ to ‘void (*)()’

现在有一种方法可以让编译器不要为这些事情生成错误。我试过用extern "C"前缀这个函数,但C ++编译器仍然不高兴。我的应用程序加载了这样的代码,我没有时间调整这么多代码。

4 个答案:

答案 0 :(得分:6)

错误非常清楚,您的演员表无效。您不能使用将参数作为不带参数的函数的函数。

要使代码正常工作,您需要:

  1. 使用合理的默认值创建一个调用display_interactions_in_element的新函数。
  2. 或者使用无捕获且无参数的lambda来执行相同的操作(但编译器可能不支持它)。
  3. 请注意,如果您的代码尝试调用该函数,就像稍后使用参数一样,则意味着代码从根本上被破坏。

答案 1 :(得分:5)

是的,有办法。将代码编译为C。

C ++具有更严格的类型安全规则,并要求您显式转换可以在C中隐式转换的类型。

因此要么将代码编译为C,要么使代码成为有效的C ++所必需的修改,并将其编译为C ++。

您应该能够将C文件编译为C,将C ++文件编译为C ++,然后将它们链接在一起而不会出现问题。

但是当您尝试将C文件编译为C ++时,编译器会告诉您代码是否无效C ++。

答案 2 :(得分:3)

我认为您的错误来自于函数签名在C和C ++中具有不同含义的事实。第二个参数规范

void (*func)()
C中的

表示“具有未知数量和参数类型的函数”,而在C ++中,它表示“没有参数的函数”。所以这些是完全不同的,必须崩溃。

错误不在于缺少C的类型安全性,而在于您的代码。不要那样做。使用严格的原型,即使在C语言中。两种语言的正确参数规范只是

void (*func)(Patch*, long int, long int)

就是这样,一切都只是盲目地瞎逛。

答案 3 :(得分:0)

最简单的方法是更改​​函数原型和标头以声明正确类型的函数指针。例如,对于

void foreach_element_in_patch(Patch *patch, void (*func)(), 
 long arg1, long process_id);

我只需将其更改为

void foreach_element_in_patch(Patch *patch, void (*)(Patch*, long int, long int), 
 long arg1, long process_id);

而不是在每个函数调用时进行更改。

相关问题