C ++名称是否具有确定性(装饰)确定性?

时间:2010-07-15 06:11:45

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

我希望在托管代码的非托管C ++ DLL上使用LoadLibrary,然后在已经损坏的外部函数上调用GetProcAddress。我的问题是你从C ++编译器确定性得到的错误名称?那就是:如果原始的签名没有改变,名称是否总是被转换为相同的错位名称?

3 个答案:

答案 0 :(得分:6)

它没有由标准指定,并且在我的经验中肯定在同一编译器的版本之间发生了变化,尽管它必须在某些固定情况下是确定性的,因为否则将无法单独链接两个编译模块。

如果你正在使用GetProcAddress,那么将函数导出为extern "C"会更加清晰,因此它们的名称不会被破坏。

答案 1 :(得分:2)

正如其他人所说,它是特定于编译器的。但是,您可以在Agner Fog的文档中找到详细信息......

http://www.agner.org/optimize/#manuals

见该页的第5项。

此外,现在有些库可以为您处理常见编译器的修改和解码。对于Visual C ++,起点是dbghelp和imagehlp库。

http://msdn.microsoft.com/en-us/library/ms679292%28v=VS.85%29.aspx

http://msdn.microsoft.com/en-us/library/ms680321%28v=VS.85%29.aspx

答案 2 :(得分:0)

每个编译器对名称管理的处理方式不同(可能与否 - 没有标准)。如果在C ++代码中使用纯C函数,则可以使用extern“C”来压缩C函数的名称管理,以便编译器能够找到它们。