【问题标题】:Function name mangling. _cdecl convention函数名称修改。 _cdecl 约定
【发布时间】:2014-01-22 08:12:51
【问题描述】:

这个问题是关于在 DLL 中导出函数时的名称修改。微软在这个链接上说一个

下划线字符 (_) 是名称的前缀,导出使用 C 链接的 __cdecl 函数时除外。

链接:http://msdn.microsoft.com/ru-ru/library/zkwh89ks.aspx

问题是:如果我使用 C 链接导出 _cdecl 函数会发生什么?这种情况下是否有任何标准化的行为? 提前致谢。

【问题讨论】:

    标签: c++ c visual-c++ dll dllexport


    【解决方案1】:

    extern "C" void Foo(int) 将导致 Foo。 C 链接只是导出函数而不使用函数名进行修改

    【讨论】:

    • 能否请您链接一个文档或其中说明的内容?因为 msdn 说: > 对于 C 函数或声明为 extern "C" 的函数,这包括基于调用约定的特定于平台的修饰。所以这意味着有一个装饰。 msdn.microsoft.com/en-us/library/3y1sfaz2.aspx
    • publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/… 在 Name Mangeling 下(仅限 C++) 为防止 C++ 编译器对函数名进行重整,您可以将 extern "C" 链接说明符应用于一个或多个声明,如下所示下面的例子: extern "C" { int f1(int);整数 f2(整数);整数 f3(整数); };该声明告诉编译器不应破坏对函数 f1、f2 和 f3 的引用。
    • 可能是 Visual Studio 在名称中添加了下划线或类似名称,用于调用约定不同于 cdecl 但至少对于 cdecl 仅使用名称
    • 但这只是证明了“特定于平台”的论点。
    • agner.org/optimize/calling_conventions.pdf 第 41 页我认为这会对您有所帮助。似乎 extern "C" 并没有完全删除名称管理
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2018-12-25
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    相关资源
    最近更新 更多