我正在将遗留的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 ++编译器仍然不高兴。我的应用程序加载了这样的代码,我没有时间调整这么多代码。
答案 0 :(得分:6)
错误非常清楚,您的演员表无效。您不能使用将参数作为不带参数的函数的函数。
要使代码正常工作,您需要:
display_interactions_in_element
的新函数。请注意,如果您的代码尝试调用该函数,就像稍后使用参数一样,则意味着代码从根本上被破坏。
答案 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);
而不是在每个函数调用时进行更改。