【发布时间】:2016-06-20 15:30:47
【问题描述】:
如果我在 .c 中有一个函数,比如
void foo(int c, char v);
...在我的 .obj 中,这变成了一个名为
的符号_foo
...根据 C 名称修改规则。如果我在 .cpp 文件中有类似的函数,则根据编译器特定的名称修改规则,这完全是另外一回事。 msvc 12 会给我们这个:
?foo@@YAXHD@Z
如果我在 .cpp 文件中有该函数 foo 并且我希望它使用 C 名称修改规则(假设我可以不重载),我们可以将其声明为
extern "C" void foo(int c, char v);
...在这种情况下,我们又回到了过去
_foo
...在 .obj 符号表中。
我的问题是,是否可以反过来?如果我想用一个 C 函数来模拟 C++ 名称修改,使用 gcc 会很容易,因为 gcc 的名称修改规则只使用标识符友好的字符,因此 foo 的修改名称变为 _ZN3fooEic,我们可以轻松编写
void ZN3fooEic(int c, char v);
回到微软编译器领域,我显然无法创建名称是完全无效标识符的函数
void ?foo@@YAXHD@Z(int c, char v);
...但我仍然希望该函数在 .obj 符号表中显示该符号名称。
有什么想法吗?我查看了 Visual C++ 支持的编译指示,但没有发现任何有用的东西。
【问题讨论】:
-
@mustafagonul 我不想破坏 - 我想破坏。
-
即使你能做到这一点,你也必须以某种方式匹配 ABI。你在这棵树上叫错了树。为此使用 extern "C" 并接受限制。
-
@mustafagonul 你不太明白这一点。我知道损坏和未损坏的名称是什么。我想在 C 文件中伪造 C++ 名称修改。
-
任何名称修改将保持一致的假设也不是一个好的假设。你只是在要求人们在几年内恨你。
-
... 更不用说众所周知微软会不时更改 VSC++ 的 ABI。顺便说一句,它不完全是
cdecl,而是cdecl的扩展。我的意思是,C++ ABI 需要处理名称修改、异常、虚拟表以及所有这些时髦的东西。
标签: c++ c visual-c++ gcc linker