【问题标题】:How to force compiler to mangle C names to C++ names如何强制编译器将 C 名称更改为 C++ 名称
【发布时间】:2015-03-24 21:51:26
【问题描述】:

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

【问题讨论】:

  • 一个 C 函数具有作为 C++ 成员函数链接所需的一切 ??真的,包括 this 指针?这个怎么可能? AFAIK C 不知道 this
  • 因为我将它指定为第一个参数..
  • 你不是在问真正的问题。将 c++ 写成 c 是有原因的。通常你做相反的事情,编写c++类并用c接口包装它,当this添加为void*作为每个方法的第一个参数。
  • 您可以尝试手动修改名称并将修改后的名称放入 C 代码中,但我不确定您为什么不只使用 c++ 编译器?

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


【解决方案1】:

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

当然,您可以使用该函数实现一个 C++(成员)函数(额外的间接级别被优化掉了如果调用是inline ) 如

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); }
};

如果已经声明了 C++ 类并且无法触及其声明,那么您仍然可以在单独的源文件中以相同的方式实现成员函数。但是,这不能是inline,因此需要额外的函数调用:

in file.cpp:

extern "C" { int my_C_func(void*, int); }  // could be in an included header
int A::operator()(int i) { return my_C_func(this,i); }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2016-12-24
    相关资源
    最近更新 更多