MSVC功能需求

MSVC function demangling

本文关键字:功能需求 MSVC      更新时间:2023-10-16

我有下一个函数:

namespace TEST {
    class TEST {
        int a;
        int b;
    };
}
namespace UNION_TEST {
    union UNION_TEST {
        int a;
        int b;
    };
}
union UNION_TEST_NEW {
    int a;
    int b;
};
namespace NAMESPACE_1 {
    namespace NAMESPACE_2 {
        union UNION_NAMESPACE_2 {
            int a, b;
        };
    }
}

void f1(UNION_TEST::UNION_TEST t, UNION_TEST::UNION_TEST t1) {
    return;
}
void f2(UNION_TEST::UNION_TEST t, TEST::TEST c, UNION_TEST::UNION_TEST t1) {
    return;
}
void f3(UNION_TEST_NEW u) {
    return;
}
void f4(NAMESPACE_1::NAMESPACE_2::UNION_NAMESPACE_2 u, TEST::TEST c, UNION_TEST::UNION_TEST t1) {
    return;
}

和对应的混乱符号为:

0x000034e0  2  .text  ?f1@@YAXTUNION_TEST@1@0@Z
0x00003500  2  .text  ?f2@@YAXTUNION_TEST@1@VTEST@2@0@Z
0x00003520  2  .text  ?f3@@YAXTUNION_TEST_NEW@@@Z
0x00003530  2  .text  ?f4@@YAXTUNION_NAMESPACE_2@NAMESPACE_2@NAMESPACE_1@@VTEST@4@TUNION_TEST@5@@Z

根据这个http://www.agner.org/optimize/calling_conventions.pdf(第27页),我们有联合X -> TX@@,那么为什么对于函数f1, f2没有@@在末尾,以及如何区分何时联合与命名空间是结束和开始下一个参数?

感谢您的关注和帮助。

正如您所观察到的,将联合名称X转换为TX@@的声明并不是对您的MSVC版本所使用的名称混淆的正确描述。请注意,"agner.org"与微软无关,也不提供官方文档。

至于你的问题是如何将一个混乱的名称的不同部分分开,看来一个@就足够了。