如何强制编译器将C名称转换为C ++名称

时间:2015-01-26 13:20:41

标签: c++ c windows symbols name-mangling

我的.obj函数包含了需要作为C ++成员函数链接的所有东西。问题是,它在C中,因此使用它的类需要比它的正常名称更丑的东西。所以我认为这可以通过两种方式完成:要么破坏C函数的名称和/或在符号表中添加额外的符号,否则它会有错位的名称,但我仍然可以使用它的原始名称太......所以基本上这个名字。任何想法如何做到这一点或有一些完全其他方式来解决这个问题?请分享,但要考虑说extern" C"在这个特殊情况下:))thx

1 个答案:

答案 0 :(得分:7)

您的(基于C的)目标文件有一个符号,您不能将该符号重新定义为具有不同的名称 - 这将是编译器生成该目标文件的任务。 C编译器不了解C ++,也不能使用C ++链接和名称修改来发出符号。因此,使用该符号(您的C函数)的唯一方法是通过它所知道的符号来调用它。

当然,你可以使用该函数来实现一个C ++(成员)函数(如果调用是{{1>,那么额外的间接级别就会被优化掉

inline

如果已经声明了C ++类并且无法触及其声明,那么您仍然可以在单独的源文件中以相同的方式实现成员函数。但是,这不能是extern "C" { int my_C_func(void*, int); } // could be in an included header struct A { // implement the followind member using the C function int operator()(int i) { return my_C_func(this,i); } }; ,因此需要额外的函数调用:

inline

从您对我的回复评论中,我得出结论,您实际上已经控制了C函数的实现。那么,为什么需要在C中实现这个呢?为什么不能简单地用C ++实现它?然后,您将获得正确的链接和名称修改,您可以直接实现所需的成员函数。