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

Met*_*est -3 c c++ compiler-errors

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

 void foreach_element_in_patch(Patch *patch, void (*func)(), 
long arg1, long process_id);
Run Code Online (Sandbox Code Playgroud)

在最初的C代码中,它就像这样使用......

 foreach_element_in_patch( patch, display_interactions_in_element, 
mode, process_id );
Run Code Online (Sandbox Code Playgroud)

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

 foreach_element_in_patch( patch, (void (*)())display_interactions_in_element, 
mode, process_id );
Run Code Online (Sandbox Code Playgroud)

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

invalid conversion from ‘void (*)(Patch*, long int, long int)’ to ‘void (*)()’
Run Code Online (Sandbox Code Playgroud)

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

Cat*_*lus 6

错误非常明显,您的演员表无效.您不能使用将参数作为不带参数的函数的函数.

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

  1. 创建一个display_interactions_in_element使用合理默认值调用的新函数.
  2. 或者使用无捕获和无参数的lambda来做同样的事情(尽管你的编译器可能不支持).

请注意,如果您的代码尝试将该函数调用为稍后使用参数,则意味着代码从根本上被破坏.

  • @MetallicPriest:仅在一定程度上.C++是C的严格超集,这是一种常见的误解.事实并非如此. (4认同)
  • 它应该尽可能向后兼容*,同时仍然是一种更好,更严格,更安全的语言.由于C类型系统如此破碎,C++必须以某种方式破坏兼容性. (2认同)

jal*_*alf 5

是的,有一种方法.将代码编译为C.

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

因此,要么将代码编译为C,要么将代码所需的修改作为有效的C++,并将其编译为C++.

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

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